模板模式通常又称为模板方法模式(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; ... }
|
类图如下:
适用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为被提取出来并被被集中到一个公共的父类中,从而避免代码重复
模式优点
模式缺点
- 类的数目增加
- 间接地增加了系统实现地复杂度
- 由于继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要修改一遍
参考