设计模式之模板设计模式

248 阅读2分钟

定义

  • 模板模式是行为型设计模式。
  • 在一个算法流程或者执行流程里,把一系列公共不会变动的算法提取出来。把需要改动的一块代码抽象出来交给子类去重写。通俗的讲就是很多相同步骤的流程里,可能在某个步骤里存在差别。例如在《大话设计模式》中提到的考试场景模式,学生们的试卷都是一样的,只是学生回答的答案不一样,这种场景就适合使用模板模式。

代码实现

/**
 * 模板抽象类
 *
 * @Author: ZRH
 * @Date: 2021/2/9 11:39
 */
public abstract class AbstractPaper {

    /**
     * 不可变的执行流程模板方法
     */
    public final void templateMethod() {
        System.err.println("问题A :xxx***xxx***?");
        abstractAnswerA();
        System.err.println("问题B :xxx***xxx***?");
        abstractAnswerB();
        System.err.println("问题C :xxx***xxx***?");
        abstractAnswerC();
    }

    /**
     * 抽象答案方法
     */
    public abstract void abstractAnswerA();

    /**
     * 抽象答案方法
     */
    public abstract void abstractAnswerB();

    /**
     * 抽象答案方法
     */
    public abstract void abstractAnswerC();
}
/**
 * 模板方法
 *
 * @Author: ZRH
 * @Date: 2021/2/9 11:47
 */
public class TemplateUserA extends AbstractPaper {

    @Override
    public void abstractAnswerA() {
        System.err.println("问题A的答案是 A");
    }

    @Override
    public void abstractAnswerB() {
        System.err.println("问题B的答案是 B");
    }

    @Override
    public void abstractAnswerC() {
        System.err.println("问题C的答案是 C");
    }
}
    /**
     * 测试模板方法
     * @param args
     */
    public static void main(String[] args) {

        new TemplateUserA().templateMethod();
    }
问题A :xxx***xxx***?
问题A的答案是 A
问题B :xxx***xxx***?
问题B的答案是 B
问题C :xxx***xxx***?
问题C的答案是 C

使用场景和优劣势

  • 模板模式是实际项目或源码中使用非常多的一种设计模式,例如spring的JdbcTemplate,事务管理器AbstractPlatformTransactionManager,MVC控制器等等。还有根据项目业务需求也可以且容易使用模板模式。
  • 优点 :在其父类提取了公共不变的算法模板, 其子类扩展了可变化算法流程,提高了代码复用性。符合对修改关闭,对扩展开发的原则。
  • 缺点 :每个不同的实现都需要增加子类,提升了代码复杂度,项目类数量增加也会加大JVM类加载负荷。父类的抽象方法依赖子类的实现,所以父类的执行结果依赖于子类执行结果,这种结构提升了代码阅读的困难性。

模板模式和策略模式的区别

  • 策略模式类之间关系多用组合/实现,少用继承。而模板模式中算法类使用继承方式。
  • 策略模式注重策略实现类的组织和调用。而模板模式注重模板类中模板方法的实现。
  • 虚心学习,共同进步 -_-