模板方法设计模式

模板方法-定义与类型

  • 定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
    模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
  • 类型:行为型

UML图

模板方法

模板方法-适用场景

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复(代码重构时经常使用,钩子方法)

模板方法-优点

提高复用性
提高扩展性
符合开闭原则

模板方法-缺点

类数目增加
增加了系统实现的复杂度
继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

模板方法-扩展

钩子方法

模板方法-相关设计模式

模板方法模式和工厂方法模式
模板方法模式和策略模式

Coding

//一个抽象悍马模型类 HummerModel,然后有两个悍马具体型号的实现类。
public abstract class HummerModel {

    //发动了
    protected abstract void start();
    //停下了
    protected abstract void stop();
    //喇叭发出声音了
    protected abstract void alarm();
    //引擎也开始响了
    protected abstract void engineBoom();
    public final void run(){
        this.start();
        this.engineBoom();
        this.alarm();
        this.stop();
    }
}
public class HummerH1Model extends HummerModel {

    @Override
    protected void start() {
        System.out.println("悍马H1发动");
    }

    @Override
    protected void stop() {
        System.out.println("悍马H1停车");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马H1鸣笛");
    }

    @Override
    protected void engineBoom() {
        System.out.println("悍马H1引擎发出声响");
    }

}
public class HummerH2Model extends HummerModel{

    @Override
    protected void start() {
        System.out.println("悍马H2发动");
    }

    @Override
    protected void stop() {
        System.out.println("悍马H2停车");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马H2鸣笛");
    }

    @Override
    protected void engineBoom() {
        System.out.println("悍马H2引擎发出声响");
    }

}

上面的代码有个问题,喇叭是默认响的,人不能控制,怎么完善呢?
注意!钩子方法应该是最开始设计就有的,而不是去完善、纠正错误的

public abstract class HummerModel {
    //是否能发动
    protected boolean isAlarm() {
        return false;
    }
    //发动了
    protected abstract void start();
    //停下了
    protected abstract void stop();
    //喇叭发出声音了
    protected abstract void alarm();
    //引擎也开始响了
    protected abstract void engineBoom();
    public final void run(){
        this.start();
        this.engineBoom();
        if(this.isAlarm()){
            this.alarm();
        }
        this.stop();
    }
}
public class HummerH1Model extends HummerModel {

    private boolean alarmFlag = true;
    public void setAlarm(boolean isAlarm){
        alarmFlag = isAlarm;
    }
    @Override
    protected boolean isAlarm(){
        return this.alarmFlag;
    }
    @Override
    protected void start() {
        System.out.println("悍马H1发动");
    }

    @Override
    protected void stop() {
        System.out.println("悍马H1停车");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马H1鸣笛");
    }

    @Override
    protected void engineBoom() {
        System.out.println("悍马H1引擎发出声响");
    }

}

模板方法模式在源码中的应用

  • HttpServlet
  • AbstractList

模板方法模式在DTS项目中的应用

  • AbstractCalculateEstCostService

参考文献
https://www.cnblogs.com/weixk/archive/2020/06/09/13070163.html

你可能感兴趣的:(模板方法设计模式)