模板方法
应用场景
- 多个子类有共有的方法并且执行流程基本相同
- 重要,复杂的算法,可以把核心算法设计为模板方法,其他小细节由子类完成
- 重构时,模板方法比较常用,一般将子类的方法抽象到父类中去
类图介绍
模板方法其实我们早都接触过,只是不知道它有这个名字而已。其核心就是将子类中共同的部分提取出来放到父类里面去,这里提取的一般是类中的流程控制部分,而在流程控制中每个模块的具体实现则可以在子类中来完成。
模板方法,顾名思义就是为方法提供模板。所以这里为方法提供的模板就是templateMethod方法,而doSomething就是基本方法,该方法可以由父类来实现也可以由子类实现。
示例代码
抽象模板类
在抽象模板中我们定义了doSomething()抽象方法,该方法我们成为钩子函数,它需要子类去实现。子类可以通过该钩子函数来控制间接控制模板方法的执行流程。并且为了安全起见,模板方法被final修饰来防止被随意修改。
abstract class AbstractClass{ //基本方法 protected abstract void doSomething(); protected void doAnything(){}; //模板方法 public final void templateMethod(){ this.doAnything(); this.doSomething(); } }
具体模板类
class ConcreteClass extends AbstractClass{ //实现基本的方法 @Override protected void doSomething() { // TODO } }
场景类
class Client{ public static void main(String[] args) { AbstractClass ac = new ConcreteClass(); //调用模板方法 ac.templateMethod(); } }
总结
优点:充分利用封装的特性,将公共的部分提取出来。行为由父类控制,由子类实现。
缺点:子类会影响到父类的执行结果