Spring中常见的设计模式——模板模式
一、模板模式的应用场景
模板模式又叫模板方法模式(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的执行逻辑,然后把几个方法交给子类定制化完成。