之因此想写这个模板方法设计模式,我想纯属偶然!为何呢?由于最近在看关于Spring框架的源代码,刚开始看有点晕,由于你会被它全部类、接口的继承关系所迷乱,不过当你知道了它是运用哪一种设计模式,那么我想说再去看源代码至少轮廓就清晰不少了!java
Spring框架用到的设计模式很是地多,好比Resource模块运用了策略模式
,事务模块
运用了模板方法模式等等不少,我说不完,你们能够自行谷哥之。算法
接下来我就解释下什么是模板方法模式,至于它在Spring中的应用,我打算以后再写出一篇文章来进行总结!编程
模板方法
设计模式?模板模式
是一种行为设计模式,它的实现思路是,建立一个模板方法method
,在该模板类中定义一些基本方法供模板方法method
调用,这些基本方法一般是protected
修饰的,由于它并不须要对外提供访问。模板方法method
定义了一个算法的执行步骤,或者说可以提供一种默认的实现,这种实现归纳一部分子类或者所有子类的共同部分(说白了就是归纳了全部子类的共同特性,而且本身实现了它
)。设计模式
说到设计模式,不贴张UML图出来我都以为很差意思。bash
看到上面的UML图,哈哈,不慌,很是地简单!如今理清下思路,一个最基本的模板方法模式中,你须要建立一个抽象类和一个具体的实现类,从上图能够看到在抽象类中持有一个模板方法和一些基本方法,而子类只须要对这些基本方法进行实现便可,子类并不须要对模板方法进行实现,由于抽象类已经实现好了!并发
wokao,賊抽象有木有!下面我就引用一个例子对其进行说明:引用自并发编程网
框架
假设提供一种造房子的算法。算法的步骤就是模拟造房子的过程:建地基、建支撑,最后添加墙和窗户ide
最重要的一点就是不能改变此建造过程(也就是咱们不能修改或者重写模板方法的意思
),好比不可能在没用地基的时候就开始建造窗户吧!若是能够,那简直是胡扯!。这个例子中,咱们就建立了一个模板方法 – 将使用不一样的方法完成对房子的建造。ui
为了确保子类不能重写(override)这个模板方法,应当使用final。spa
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();//调用模板方法
}
}
复制代码
final
修饰