设计模式07-模板模式

模板模式通常又称为模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。模板方法属于行为型设计模式。

示例代码

https://github.com/chenpenghui93/design-pattern/tree/master/src/main/java/com/example/designpattern/template

JDK实例

JDK中AbstractList类的get()方法

1
2
3
4
5
6
7
package java.util;

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

抽象get()方法的实现逻辑在子类ArrayList、LinkedList等中来实现。

HttpServlet中的service()、doGet()、doPost()等方法的实现也是模板模式的体现。

MyBatis实例

MyBatis中的BaseExecutor类是一个基础的SQL执行类,实现大部分SQL执行逻辑,然后将其中几个方法交给子类( doUpdate、doFlushStatements、doQuery、doQueryCursor )定制化实现,源码如下:

1
2
3
4
5
6
7
8
9
10
public abstract class BaseExecutor implements Executor {
...
protected abstract int doUpdate(MappedStatement var1, Object var2) throws SQLException;
protected abstract List<BatchResult> doFlushStatements(boolean var1) throws SQLException;
protected abstract <E> List<E> doQuery(MappedStatement var1, Object var2, RowBounds var3,
ResultHandler var4, BoundSql var5) throws SQLException;
protected abstract <E> Cursor<E> doQueryCursor(MappedStatement var1, Object var2, RowBounds var3,
BoundSql var4) throws SQLException;
...
}

类图如下:

适用场景

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

模式优点

  • 提高代码的复用性
  • 提高代码的扩展性
  • 符合开闭原则

模式缺点

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

参考