模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到了子类中去,模板方法使得子类可以在不改变算法结构的基础上,重新定义算法中的某些步骤。
设计原则:好莱坞原则(别调用我们,我们会调用你)。顶层模块会主动调用底层模块,不要用底层模块去调用顶层模块。
基本结构:
public abstract class AbstractClass { /** * 模板方法: 声明为final ,不允许子类对其结构进行破坏 */ public final void templateMethod() { operate1(); operate2(); } public abstract void operate1(); public abstract void operate2(); /** * 该方法可以视情况添加 * 钩子【子类可以选择重写,主要作用是可以通过此方法控制上面的操作】 */ public void hock() { } }
具体的例子:
public abstract class CoffeineBeverageWithHook { /** * 模板方法 * */ public final void prepare() { brew(); if (customerWantCondiments()) { addCondiments(); } } public abstract void brew(); public abstract void addCondiments(); /** * 钩子方法 */ public boolean customerWantCondiments() { return true; } }
具体实现:
public class CoffeeWithHook extends CoffeineBeverageWithHook { @Override public void brew() { System.out.println("brew..."); } @Override public void addCondiments() { System.out.println("addCondiments beverage..."); } @Override public boolean customerWantCondiments() { //input condition String condition = "y"; if ("y".equals(condition)) { return true; } else { return false; } } public static void main(String[] args) { CoffeeWithHook coffeeWithHook = new CoffeeWithHook(); coffeeWithHook.prepare(); } }