一、什么是模板方法模式
模板方法在抽象类的一个方法中定义一个算法的骨架,将具体的算法实现放在子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
二、什么时候该使用钩子方法?
当你的子类“必须”提供算法中某个方法或步骤的实现时,就用抽象方法。如果算法的这个部分是可选的,就用钩子。钩子方法可以让子类控制算法结构。
三、好莱坞原则的作用
避免让高层和低层组件之间有明显的环状依赖。将决策权放在高层模块中,以便决定如何以及何时调用低层模块。
四、模板、策略和工厂方法模式的区别
模板方法--子类决定如何实现算法中的某些步骤;
策略模式---封装可互换的行为,然后使用委托来决定要采用哪一个行为;
工厂方法---由子类决定实例化哪个具体类;
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。工厂方法是模板方法的一种特殊版本。
五、模板方法模式的代码实现
package modelMethod; public class Test { public static void main(String[] args) { Coffee coffee = new Coffee(); coffee.process(); System.out.println("-------------------"); Tea tea = new Tea(); tea.process(); } }
package modelMethod; /** * 冲泡抽象模板类 * @author lenovo * */ public abstract class ChongPao { abstract void boilWater(); abstract void brew(); abstract void pourInCup(); abstract void addCondiments(); boolean hoke(){ return true; } void process(){ boilWater(); brew(); pourInCup(); if(hoke()){ addCondiments(); } } }
package modelMethod; public class Coffee extends ChongPao{ @Override void boilWater() { System.out.println("咖啡烧水"); } @Override void brew() { System.out.println("放咖啡"); } @Override void pourInCup() { System.out.println("往咖啡杯倒开水"); } @Override void addCondiments() { System.out.println("咖啡加糖"); } public boolean hoke(){ System.out.println("泡咖啡默认加糖,冲泡完成"); return false; } }
package modelMethod; public class Tea extends ChongPao{ @Override void boilWater() { System.out.println("泡茶烧水"); } @Override void brew() { System.out.println("放茶叶"); } @Override void pourInCup() { System.out.println("往茶杯倒开水"); } @Override void addCondiments() { System.out.println("往茶杯加糖"); } public boolean hoke(){ System.out.println("泡茶默认不加糖,冲泡完成"); return false; } }
运行结果: