简介
模板方法模式(Template Method Pattern)
定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
采用工厂方法的模式,将这个节点的代码实现转给子类完成。
处理步骤在父类中定义好了,具体的实现延迟到子类中给出定义。
代码实现
假设有这样一种情况
我们去医院看病分为以下三个步骤,前一个步骤,和后一个步骤固定
- 挂号
- 门诊(不固定看哪个病)
- 买药
代码如下:
首先定义父类方法
/**
* 模板方法中的父类 tabeNumber buyMedicine 的步骤固定 diagnosis的步骤不固定
* @author guxiang
* @date 2017-2-25 下午2:16:38
*/
public abstract class SeeDoctor {
public void takeNumber() {
System.out.println("挂号");
}
/**
* 交给子类去实现
*/
public abstract void diagnosis();
public void buyMedicine() {
System.out.println("买药");
}
public final void process() {
this.takeNumber();
this.diagnosis();
this.buyMedicine();
}
}
用一个客户类测试
/**
* 客户类测试
* @author guxiang
* @date 2017-2-25 下午2:20:35
*/
public class Client {
public static void main(String[] args) {
SeeDoctor sd1 = new SeeDoctor() {
@Override
public void diagnosis() {
System.out.println("诊断颈椎病");
}
};
sd1.process();
SeeDoctor sd2 = new SeeDoctor() {
@Override
public void diagnosis() {
System.out.println("诊断腰椎病");
}
};
sd2.process();
}
}
方法回调(钩子方法)
模板方法模式充分的体现了“好莱坞”原则,
“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”。 IOC是Inversion of Control的简称,IOC的原理就是基于好莱坞原则,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。(spring中有很好的体现)
子类不能调用父类,而是通过父类调用子类
常见的开发场景
- 数据库访问的封装
- Junit 的单元测试
- Spring中的 JDBCTemplate,HibernateTemplate
- hibernate中的模板程序