一、模板模式的应用场景

  模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结果的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:

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

  把东西装冰箱的步骤模板:

public abstract class PutThingIntoFrigCourse {

    protected final void createCourse() {
        //是否需要对大块的东西进行切割
        if (needCut()) {
            this.cut();
        }
        //打开冰箱门
        this.openDoor();
        //把东西放进去
        this.putThingIntoFrig();
        //关闭冰箱门
        this.closeDoor();
    }

    //钩子方法:对步骤进行微调
    protected boolean needCut() {
        return false;
    }

    //钩子方法:就是通过返回值对模板类内部进行修改
    abstract String thing();

    final void cut() {
        System.out.println("切碎" + thing());
    }

    final void openDoor() {
        System.out.println("打开冰箱门");
    }

    final void putThingIntoFrig() {
        System.out.println("把" + thing() + "放冰箱");
    }

    final void closeDoor() {
        System.out.println("关闭冰箱门");
    }
}

  这里面的钩子方法主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务需求,钩子方法通过返回值对主流程进行控制。

二、模板模式在源码中的体现 

  JDBCTemplate看这个名字就知道了。再看JDK中的AbstractList类的代码:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    ...
    abstract public E get(int index); 
    ...
}

  可以发现get()方法是一个抽象方法,交给子类实现,比如ArrayList就是AbstractList的子类。还有HttpServlet,有三个方法:service()、doGet()、doPost() 都是模板方法的抽象实现。

  在Mybatis框架中有一个BaseExecutor类,它是一个基础的sql执行类,实现了大部分SQL的执行逻辑,然后把几个方法交给子类定制化完成。

版权声明:本文为xcgShare原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xcgShare/p/12170477.html