模板方法

应用场景


  • 多个子类有共有的方法并且执行流程基本相同
  • 重要,复杂的算法,可以把核心算法设计为模板方法,其他小细节由子类完成
  • 重构时,模板方法比较常用,一般将子类的方法抽象到父类中去

类图介绍


  模板方法其实我们早都接触过,只是不知道它有这个名字而已。其核心就是将子类中共同的部分提取出来放到父类里面去,这里提取的一般是类中的流程控制部分,而在流程控制中每个模块的具体实现则可以在子类中来完成。

模板方法,顾名思义就是为方法提供模板。所以这里为方法提供的模板就是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();
    }
}

总结


优点:充分利用封装的特性,将公共的部分提取出来。行为由父类控制,由子类实现。

缺点:子类会影响到父类的执行结果

原文地址:https://www.cnblogs.com/xidongyu/p/5816947.html