模板方法模式抽象出算法执行流程进行封装,强制调用此方法的运行时类都按照此流程执行
流程中的具体步骤可由子类实现,钩子函数赋予子类决定是否执行此步骤的权利
高层设计框架严格执行流程
public abstract class AbstractBase { public abstract void stepOne(); public abstract void stepTwo(); public abstract void stepThree(); public abstract boolean isStepThreeChosen(); private void stepMutual() { System.out.println("execute StepMutual()"); } public final void execute() { // 模板方法规定了各步骤执行顺序,子类不可覆写 stepOne(); // 由子类实现的步骤 stepTwo(); // 由子类实现的步骤 if (isStepThreeChosen()) stepThree(); // 由子类决定是否执行此步骤 stepMutual(); // 强制子类执行其不可见不可更改的步骤 } }
底层负责具体步骤的实现
class Sub extends AbstractBase { @Override public void stepOne() { System.out.println("execute Sub's StepOne()"); } @Override public void stepTwo() { System.out.println("execute Sub's StepTwo()"); } @Override public void stepThree() { System.out.println("execute Sub's StepThree()"); } @Override public boolean isStepThreeChosen() { return false; } }
测试
class TestDemo { public static void main(String[] args) { new Sub().execute(); } }
execute Sub's StepOne()
execute Sub's StepTwo()
execute StepMutual()
应用
封装公用组件的初始化流程:由各实现类按需选择自身部件
封装公用算法:如JDK1.8的Arrays.sort(T[] a, Comparator<? super T> c),sort函数提供排序模板,Comparator接口实现方法提供排序算法中的比较细节
参考资料
Freeman E, Robson E. Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software[M]. Second Edition. O’Reilly, 2020.