设计模式-模板方法模式(Template Method)
时间: 2024-10-23 09:46:42
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
模板方法模式(Template Method)是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。在模板方法模式中,一个抽象类中定义了一个模板方法,该方法中包含了算法的骨架,而具体的实现细节则由子类来实现。
模板方法模式的核心思想是将相同的操作步骤抽象出来放在父类中,而将具体的实现细节留给子类来实现。这样一方面可以减少代码的重复,另一方面也可以方便扩展和维护。在模板方法模式中,父类中的模板方法是不可变的,而子类中的具体实现则是可变的,这就使得子类可以根据自己的需要来实现具体的细节。
模板方法模式的结构包含以下几个角色:
1. 抽象类(AbstractClass):定义了一个模板方法,该方法中包含了算法的骨架,其中的某些步骤是由子类来实现的。抽象类中还可以定义一些通用的方法,这些方法可以被模板方法调用。
2. 具体类(ConcreteClass):继承抽象类,实现抽象类中定义的抽象方法,完成具体的实现细节。
下面以制作咖啡为例来说明模板方法模式的应用。
在制作咖啡的过程中,可以抽象出以下几个步骤:
1. 煮水
2. 冲泡咖啡粉
3. 倒入杯子
4. 加入调料
这些步骤中,煮水和倒入杯子是通用的,而冲泡咖啡粉和加入调料则是具体的实现细节,可以由子类来实现。
首先定义一个抽象类Coffee,其中包含一个模板方法prepare(),该方法定义了制作咖啡的步骤:
public abstract class Coffee { public void prepare() { boilWater(); brewCoffee(); pourInCup(); addCondiments(); } public void boilWater() { System.out.println("Boiling water"); } public abstract void brewCoffee(); public void pourInCup() { System.out.println("Pouring coffee into cup"); } public abstract void addCondiments(); }
然后定义两个具体类,分别是BlackCoffee和MilkCoffee,它们继承自Coffee并实现其中的抽象方法:
public class BlackCoffee extends Coffee { public void brewCoffee() { System.out.println("Brewing black coffee"); } public void addCondiments() { System.out.println("Adding sugar"); } } public class MilkCoffee extends Coffee { public void brewCoffee() { System.out.println("Brewing milk coffee"); } public void addCondiments() { System.out.println("Adding milk"); } }
最后,在客户端代码中可以通过以下方式来使用模板方法模式:
public class Client { public static void main(String[] args) { Coffee blackCoffee = new BlackCoffee(); blackCoffee.prepare(); Coffee milkCoffee = new MilkCoffee(); milkCoffee.prepare(); } }
运行上述代码,可以得到以下输出:
Boiling water Brewing black coffee Pouring coffee into cup Adding sugar Boiling water Brewing milk coffee Pouring coffee into cup Adding milk
可以看到,模板方法模式将制作咖啡的步骤抽象出来放在抽象类Coffee中的模板方法prepare()中,具体的实现细节则由子类BlackCoffee和MilkCoffee来实现。这样一来,不同的咖啡可以通过继承Coffee并实现自己的具体细节来实现不同的制作过程。同时,模板方法模式还可以方便地扩展和维护,例如可以在抽象类中添加新的步骤或者修改已有的步骤,而不需要修改子类的代码。
总之,模板方法模式是一种非常实用的设计模式,它通过将相同的操作步骤抽象出来放在父类中,将具体的实现细节留给子类来实现,从而实现了代码的重用和扩展。在实际的开发中,可以根据需要使用模板方法模式来设计和实现具有相同操作步骤的类。