一、先唠唠嗑!
之所以想写这个模板方法设计模式,我想纯属偶然!为什么呢?因为最近在看关于Spring框架的源代码,刚开始看有点晕,因为你会被它所有类、接口的继承关系所迷乱,不过当你知道了它是运用哪种设计模式,那么我想说再去看源代码至少轮廓就清晰很多了!
Spring框架用到的设计模式非常地多,比如Resource模块运用了策略模式
,事务模块
运用了模板方法模式等等很多,我说不完,大家可以自行谷哥之。
接下来我就解释下什么是模板方法模式,至于它在Spring中的应用,我打算之后再写出一篇文章来进行总结!
二、什么是模板方法
设计模式?
模板模式
是一种行为设计模式,它的实现思路是,创建一个模板方法method
,在该模板类中定义一些基本方法供模板方法method
调用,这些基本方法通常是protected
修饰的,因为它并不需要对外提供访问。模板方法method
定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分(说白了就是概括了所有子类的共同特性,并且自己实现了它
)。
说到设计模式,不贴张UML图出来我都觉得不好意思。
看到上面的UML图,哈哈,不慌,非常地简单!现在理清下思路,一个最基本的模板方法模式中,你需要创建一个抽象类和一个具体的实现类,从上图可以看到在抽象类中持有一个模板方法和一些基本方法,而子类只需要对这些基本方法进行实现即可,子类并不需要对模板方法进行实现,因为抽象类已经实现好了!
wokao,賊抽象有木有!下面我就引用一个例子对其进行说明:引用自并发编程网
假设提供一种造房子的算法。算法的步骤就是模拟造房子的过程:建地基、建支撑,最后添加墙和窗户
- Fundation
- Pillars
- Walls
- Windows。
最重要的一点就是不能改变此建造过程(也就是我们不能修改或者重写模板方法的意思
),比如不可能在没用地基的时候就开始建造窗户吧!如果可以,那简直是胡扯!。这个例子中,我们就创建了一个模板方法 – 将使用不同的方法完成对房子的建造。
为了确保子类不能重写(override)这个模板方法,应当使用final。
HouseTemple.java(这个对应我们上面UML图中的AbstractClass)
package com.journaldev.design.template;
//抽象类
public abstract class HouseTemplate {
//这是我们的模板方法,子类不能重写
public final void buildHouse(){
buildFoundation();//第一步:建造地基
buildPillars();//第二步,建造支撑
buildWalls();//第三步,建造墙
buildWindows();//第四步,建造窗户
System.out.println("House is built.");
}
//这个步骤可以默认实现,原文是private修饰,那么就是说我规定死啦,这个步骤只能这样实现了,但为了易扩展,还是protected OK点
protected void buildWindows() {
System.out.println("Building Glass Windows");
}
//被子类实现的方法
protected abstract void buildWalls();
protected abstract void buildPillars();
protected void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
复制代码
下面就写下具体的实现类:
WoodenHouse.java
package com.journaldev.design.template;
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}
复制代码
GlassHouse.java
package com.journaldev.design.template;</code>
public class GlassHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}
}
复制代码
使用模板方法:
package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
//创建一个模板,子类由WoodenHouse实现
HouseTemplate houseType = new WoodenHouse();
houseType.buildHouse();//调用模板方法
System.out.println("************");
//创建一个模板,子类由GlassHouse实现
houseType = new GlassHouse();
houseType.buildHouse();//调用模板方法
}
}
复制代码
三、模板方法设计模式的特点
- 1、模板方法不能被子类重写,可用
final
修饰 - 2、一个模板方法有确定的步骤组成,这些步骤可以被不同的子类实现,也可以自己实现
四、模板方法设计模式应用场景
- 1、对于一个业务方法步骤固定,但这些步骤可以有不同的实现情况下
- 2、Spring JdbcTemplate、Spring Transaction中用到了