之因此想寫這個模板方法設計模式,我想純屬偶然!爲何呢?由於最近在看關於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
修飾