TEMPLATE METHOD 模式
一.概述
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二.类图
三.实现
模板方法模式的基本框架及实现
package cn.zzf.templet.method;
/**
* @author GaoFeng2017
* @date 2018-06-03 23:22:29
**/
public abstract class AbstractTemplate
{
protected String name;
private void step1() {
System.out.println("不可改变的固定步骤1");
}
protected final void step2() {
System.out.println("不可改变但可被子类调用的固定步骤2");
}
private void step3() {
System.out.println("不可改变的的固定步骤3");
}
protected abstract void step4();
/**
* step1的钩子方法
*/
protected boolean isDoStep1() {
return true;
}
/**
* 空实现的钩子方法
*/
protected void hookStep() {
}
public final void run() {
if (isDoStep1()) {
step1();
} else {
step3();
}
step2();
step4();
hookStep();
}
}
package cn.zzf.templet.method;
/**
* @author GaoFeng2017
* @date 2018-06-04 09:20:38
**/
public class TemplateImpl extends AbstractTemplate {
@Override
protected void step4() {
System.out.println("TemplateImpl特有的具体实现");
}
@Override
protected boolean isDoStep1() {
return false;
}
@Override
protected void hookStep() {
System.out.println("缺省钩子方法的具体实现");
}
public static void main(String[] args) {
TemplateImpl template = new TemplateImpl();
template.run();
}
}
package cn.zzf.templet.method;
/**
* @author GaoFeng2017
* @date 2018-06-04 09:27:58
**/
public class TemplateOtherImpl extends AbstractTemplate {
@Override
protected void step4() {
System.out.println("TemplateOtherImpl特有的具体实现");
super.step2();
}
public static void main(String[] args) {
TemplateOtherImpl templateOther = new TemplateOtherImpl();
templateOther.run();
}
}
TemplateImpl的运行结果
不可改变的的固定步骤3
不可改变但可被子类调用的固定步骤2
TemplateImpl特有的具体实现
缺省钩子方法的具体实现
TemplateOtherImpl的运行结果
不可改变的固定步骤1
不可改变但可被子类调用的固定步骤2
TemplateOtherImpl特有的具体实现
不可改变但可被子类调用的固定步骤2
分析
- AbstractTemplate 是模板类,里面定义了子类公共的算法逻辑,封装成了可调用的方法,并把不公共的定义为抽象方法,给子类自己实现。除此之外,模板类中含有钩子方法,这些钩子方法的作用在于控制模板类某些方法是否执行,或者给子类提供一些缺省的功能。
- TemplateImpl和TemplateOtherImpl 是模板类的实现类,他们不同的地方在于step4这个抽象方法的实现,而相同的算法都被封装在了高层模板,也就是父类。
- 值得注意的是,模板类中留给子类实现的抽象方法的修饰符为protected,必须要执行的通用方法为private,是为了减少对外暴露,并且让子类能够重写和调用。另外,模板方法run包含final修饰符,目的是不让子类重写,它是整个算法的框架。
四.总结
模板方法模式是一个非常简单的设计模式,甚至有时候我们即使在使用它,却感受不到它的存在。其核心在于,把通用算法以及放在基类,并暴露一些抽象方法给子类实现,将低层模块和高层模块分离。但是,这种分离代价还是比较大的,因为继承是一强耦合的关系。