目录
一,模板模式
模板模式(Template Pattern)是一种行为型设计模式,它在超类中定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。
二,特点
-
算法骨架:在超类中定义了算法的骨架,即算法的整体步骤。
-
钩子(Hooks):在模板方法中定义的一些方法,它们在超类中不做具体实现,而是在子类中根据需要重写。
-
抽象操作:在模板方法中定义的一些抽象方法,它们在子类中必须被实现。
-
具体操作:在模板方法中定义的一些具体方法,它们在超类中已经实现,也可以在子类中被覆盖。
-
扩展性:模板模式通过在子类中覆盖钩子和抽象操作,可以很容易地扩展新的功能。
三,组成部分
- AbstractClass:定义了模板方法和一些抽象操作,以及一个或多个钩子方法。
- ConcreteClass:继承自AbstractClass,实现模板方法中的抽象操作,也可以覆盖钩子方法。
四,实现步骤
- 定义一个抽象类
AbstractClass
,其中包含模板方法和其他一些操作。 - 在
AbstractClass
中实现模板方法,调用所有必要的操作。 - 定义一个或多个具体操作,这些操作在抽象类中是抽象的,需要在子类中实现。
- 定义钩子方法,它们在模板方法中被调用,但在抽象类中不做具体实现。
- 创建一个或多个继承自
AbstractClass
的子类,实现抽象操作,并根据需要覆盖钩子方法。
五,案例
java
abstract class CafeMaker {
public final void makeCoffee(){//模板方法 定义了制作咖啡的步骤
putWaterInMachine();
putCoffeeBeansInMachine();
cook();
pourInCup();
}
protected void cook(){//钩子方法
System.out.println("使用机器烹制");
}
protected abstract void putWaterInMachine();//定义抽象方法
protected abstract void putCoffeeBeansInMachine();//定义抽象方法
private void pourInCup() {//具体方法
System.out.println("将咖啡倒入杯子里");
}
}
class EspressoMaker extends CafeMaker{
@Override
protected void putWaterInMachine() {
System.out.println("加入热水");
}
@Override
protected void putCoffeeBeansInMachine() {
System.out.println("加入咖啡豆");
}
}
class Client {
public static void main(String[] args) {
CafeMaker maker = new EspressoMaker();
maker.makeCoffee();
}
}
在这个例子中,CafeMaker
是一个抽象类,它定义了制作咖啡的算法骨架(模板方法 makeCoffee()
),同时定义了两个抽象方法 putWaterInMachine()
和 putCoffeeBeansInMachine()
,这些方法由具体子类实现。此外,它还包含一个钩子方法 烹制()
和一个具体方法 pourInCup()
。
EspressoMaker
是 CafeMaker
的具体实现,它继承自 CafeMaker
并提供了 putWaterInMachine()
和 putCoffeeBeansInMachine()
方法的实现。
客户端代码通过创建 EspressoMaker
的实例,并调用 makeCoffee()
方法来制作咖啡。
这个模板模式的例子展示了如何通过定义算法的骨架和推迟某些步骤到子类中实现,来达到代码复用和扩展性的目的。