摘录自headfirst 设计模式:
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
实例说明:
做热咖啡或者热茶需要步骤:1.烧水,2.用沸水冲泡咖啡(或茶),3.倒进杯子里,4.加调料,其中步骤1和3是做咖啡或茶共通的方法,步骤2和4的具体细节是不相同的,因此抽象出步骤类,将步骤2和4抽象成方法各子类均有不同实现
高层组件:CaffeineBeverageWithHook.java
/** * 高层组件 * * @author :liuqi * @date :2018-06-11 16:00. */ public abstract class CaffeineBeverageWithHook { /** * 模板方法:抽出做茶和咖啡共通的方法 */ void prepareRecipe() { // 烧水 boilWater(); // 用沸水冲泡 brew(); // 倒进杯里 pourIncup(); // 如果顾客想要调料则添加调料 if (customerWantsConfiments()) { // 添加调料 addCondiments(); } } /** * 用沸水冲泡(各子类实现不同) * <p> * 抽象方法 */ abstract void brew(); /** * 加调料(各子类实现不同) * <p> * 抽象方法 */ abstract void addCondiments(); /** * 烧水 */ void boilWater() { System.out.println("boiling water"); } /** * 倒进杯里 */ void pourIncup() { System.out.println("Pouring into cup"); } /** * 顾客是否想要调料 * hook 钩子,子类可以覆盖 * * @return */ boolean customerWantsConfiments() { return true; } }
低层组件:CoffeeWithHook.java 和 TeaWithHook.java
/** * 做咖啡的方法类 * * @author :liuqi * @date :2018-06-11 16:00. */ public class CoffeeWithHook extends CaffeineBeverageWithHook { /** * 用沸水冲泡咖啡的方法 */ @Override void brew() { System.out.println("Dripping coffee through filter"); } /** * 添加咖啡所需要的调料 */ @Override void addCondiments() { System.out.println("adding suger and milk"); } /** * 覆盖了hook * * @return */ @Override public boolean customerWantsConfiments() { // 顾客想要不加任何调料的咖啡(这里写死) return false; } }
/** * 做茶的方法类 * * @author :liuqi * @date :2018-06-11 16:09. */ public class TeaWithHook extends CaffeineBeverageWithHook { /** * 用沸水冲泡茶的方法 */ @Override void brew() { System.out.println("Steeping the tea"); } /** * 添加茶所需要的调料 */ @Override void addCondiments() { System.out.println("Adding lemon"); } }
测试类:BeverageTestDrive.java
/** * 测试类 * * @author :liuqi * @date :2018-06-11 16:13. */ public class BeverageTestDrive { public static void main(String[] args) { TeaWithHook tea = new TeaWithHook(); CoffeeWithHook coffee = new CoffeeWithHook(); System.out.println("making tea~~~~~"); tea.prepareRecipe(); System.out.println("making coffee~~~~~"); coffee.prepareRecipe(); } }
运行结果:
making tea~~~~~
boiling water
Steeping the tea
Pouring into cup
Adding lemon
making coffee~~~~~
boiling water
Dripping coffee through filter
Pouring into cup
代码地址:https://github.com/yuki9467/TST-javademo/tree/master/src/main/template