1 模板方法模式概述
模板方法核心就是定义整体的逻辑,具体实现可由子类去实现;将一些不变的行为放到抽象类中,这样就能去除子类中不断重复代码的现象,提供了很好的代码复用的实现方式。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2 模板方法模式结构图
组成:
抽象模板(AbstractClass):定义了完整的框架来确定方法的调用顺序,但是仍然会定义一些抽象的方法给子类去实现。
具体模板实现类(ConcreteClass):实现抽象模板中定义的抽象方法。
3 模板方法模式的Java代码实现
定义一个逻辑的整体框架,如下面的代码中进入旅行社后travelAgencyProcess()定义的整个流程,流程中每个步骤的具体实现由子类去实现:
(1)抽象模板:AbstractTravelAgency.java
public abstract class AbstractTravelAgency {
//具体的实现交由子类去实现,即每个人的选择是不一样的
public abstract void login();
public abstract void selectTravelWay();
public abstract void travelStart();
//定义进入旅行社后的整个流程:登记---选择出行方式---出发
public void travelAgencyProcess(){
login();
selectTravelWay();
travelStart();
}
}
(2)具体模板实现子类:
ConcretePersonA .java
public class ConcretePersonA extends AbstractTravelAgency {
@Override
public void login() {
System.out.println("我叫韩梅");
}
@Override
public void selectTravelWay() {
System.out.println("我选择坐灰机");
}
@Override
public void travelStart() {
System.out.println("准备好,飞机要出发了!");
}
}
ConcretePersonB .java
public class ConcretePersonB extends AbstractTravelAgency {
@Override
public void login() {
System.out.println("我叫李雷");
}
@Override
public void selectTravelWay() {
System.out.println("我选择坐高铁");
}
@Override
public void travelStart() {
System.out.println("坐稳了,老司机要发车了!");
}
}
(4)测试类:
public class Main {
public static void main(String[] args) {
AbstractTravelAgency a = new ConcretePersonA();
a.travelAgencyProcess();
AbstractTravelAgency b = new ConcretePersonB();
b.travelAgencyProcess();
}
}
输出:
我叫韩梅
我选择坐灰机
准备好,飞机要出发了!
我叫李雷
我选择坐高铁
坐稳了,老司机要发车了!
4 Spring 中模板方法模式的实现
Java类库中常常会提取类库中的公共行为到抽象类中。
Spring MVC 中的View设计也同样使用的是模板设计模式。
如图,View只定义了接口方法,AbstractView类实现了在View中定义的所有方法,并留有一个抽象方法renderMergedOutputModel给子类去实现。而AbstractJasperReportsView 和 AbstractTemplateView 抽象类又进一步实现了AbstractView的抽象方法和renderMergedTemplateModel给子类去进一步实现。越往下面的子类需要实现的功能越少,整个模板已经建立,所以模板模式能加快整个程序的开发进度。
参考:
1)http://blog.csdn.net/jason0539/article/details/45037535
2)《深入分析Java Web》