Java中的模板方法模式是一种行为设计模式,用于定义算法的框架并允许子类重写某些步骤,同时不改变算法的结构.
该模式基于开放/关闭原则,即对扩展开放,对修改关闭,在模板方法模式中,父类定义了一个算法的骨架,而子类可以通过实现父类的抽象方法,来自定义某些步骤的行为,整个算法步骤不会因为子类的改变而改变
模板方法模式通常包括一个抽象类和若干个具体子类,抽象类中定义了算法的框架,包括一些基本的方法和一个模板方法.模板方法是一个模板,其中包含了算法的步骤,每个步骤都有一个抽象方法或一个默认方法实现,具体的子类可以通过实现这些抽象方法来实现自己的行为.
抽象类中还可以有钩子函数,钩子函数通常是抽象类中的虚函数,其默认实现为空,这样子类可以选择覆盖该函数来实现特定的行为.在模板方法模式中,钩子函数通常用于在算法的某些特定步骤中进行特定的操作或检查条件.钩子函数的另一个用途是提供一种扩展算法的方法,子类可以通过覆盖钩子函数来添加额外的步骤或者修改算法的行为.总之钩子函数是模板方法模式中的一个重要概念,可以用来影响算法的行为或者扩展算法的功能.
首先定义咖啡抽象类
package com.fanqiechaodan.templatemethod;/*** @author fanqiechaodan* @Classname CoffeeMaker* @Description 咖啡抽象类* @Date 2023/3/9 18:50*/
public abstract class CoffeeMaker {public final void makeCoffee() {boilWater();brewCoffee();pourInCup();if (isCondiments()) {addCondiments();}}private void boilWater() {System.out.println("煮水");}protected abstract void brewCoffee();private void pourInCup() {System.out.println("倒入杯子中");}/*** 钩子函数;是否加入调料,由子类决定是否重写** @return*/protected boolean isCondiments() {return true;}protected abstract void addCondiments();
}
其次定义两个具体子类
public class AmericanoMaker extends CoffeeMaker{@Overrideprotected void brewCoffee() {System.out.println("冲泡美式咖啡");}@Overrideprotected void addCondiments() {System.out.println("加入牛奶和糖");}/*** 钩子函数;是否加入调料,由子类决定是否重写** @return*/@Overrideprotected boolean isCondiments() {return false;}
}public class LatteMaker extends CoffeeMaker{@Overrideprotected void brewCoffee() {System.out.println("冲泡浓缩咖啡");}@Overrideprotected void addCondiments() {System.out.println("添加奶泡和焦糖酱");}
}
测试
package com.fanqiechaodan.templatemethod;/*** @author fanqiechaodan* @Classname Demo* @Description 模板方法模式* @Date 2023/3/9 18:57*/
public class Demo {public static void main(String[] args) {CoffeeMaker americanoMaker = new AmericanoMaker();americanoMaker.makeCoffee();System.out.println();CoffeeMaker latteMaker = new LatteMaker();latteMaker.makeCoffee();}
}
优点
缺点
应用场景