名词解释
Template Method Pattern,又叫 模板方法模式
指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为性设计模式
适用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复
实现思路
为了达到各个类都实现相同的处理步骤,可以用一个父类的某个方法来定规定我们每一步的操作功能已经各步骤的执行顺序,这个方法就是模板方法,同时,在这些规定好的步骤中,有些我们步骤可能是每一步都是一样的,也有可能各个子类会各有不同,有些步骤是子类可以用父类的,也可以支持自己自定的,为了实现灵活的需求,很容易就想到 抽象类
定义模板类:
public abstract class DefineStep {
public final void entrance(){ //模板入口,在这里规定各个步骤的调用顺序,这一步是不允许各子类修改的,所以定义为 final
stepOne();
stepTwo();
stepThree();
}
protected void stepOne(){
//这一步,可以有父类的实现,也可以让子类来自己实现,所以定义为 可继承的
System.out.println("父类的步骤1,可以用我的,也可以用你自己的");
};
protected abstract void stepTwo(); //这一步是抛出给各个子类来自行实现的,父类完全不管,子类必须要自己实现,所以定义为 abstract
protected final void stepThree(){
//假设第一步都是一样的,且不允许各子类有自己的个性化实现,所以定义为final
System.out.println("这里就必须用我的");
};
}
在各子类中可以分别实现或者继承个别步骤
public class ChildOne extends DefineStep {
@Override
protected void stepTwo() {
System.out.println("这里我第一个孩子的第二步");
}
}
再如:
public class ChildTwo extends DefineStep {
@Override
protected void stepTwo() {
System.out.println("这里我第二个孩子的第二步");
}
@Override
protected void stepOne() {
System.out.println("我不打算用你的第一步了");
}
}
应用举例
- JdbcTemplate
- AbstractList
package java.util;
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
abstract public E get(int index);
...
}
- AbstractSet、AbstractMap
- HttpServlet(service()、doGet()、doPost())
- MyBatis 的 BaseExecutor 类