行為型模式:模板方法
LieBrother公眾號原文:
行為型模式:模板方法
十一大行為型模式之一:模板方法。
簡介
姓名:模板方法
英文名:Template Method Pattern
價值觀:在我的掌控下,任由你發揮
個人介紹 :
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
(來自《設計模式之禪》)
解釋一下上面的介紹,意思是由父類來定義框架,讓子類來具體實現。
你要的故事
剛過完春節,大家都買新鞋了麼?今天要講的故事和鞋子有關。一雙鞋子從表面來看,由鞋底、鞋墊、鞋面、鞋帶組成,同一系列的鞋子這幾個部分都是一樣的,用同樣的材料做出來,不同系列的鞋子就大相徑庭了。根據模板方法模式,組裝一雙鞋子的製造過程可以歸併為固定的框架,至於用什麼材料,那由每個系列的鞋子去具體實現。我們先看定義組裝鞋子的框架程式碼。
/** * 定義鞋子製造的工序框架 */ abstract class ShoeInstallTemplate { public abstract void installSole(); public abstract void installInsole(); public abstract void installVamp(); public abstract void installShoelace(); public void installShot(){ System.out.println("組裝一雙鞋,步驟如下:"); // 組裝鞋底 installSole(); // 組裝鞋墊 installInsole(); // 組裝鞋面 installVamp(); // 組裝鞋帶 installShoelace(); } }
定義了一個組裝鞋子框架的抽象類 ShoeInstallTemplate,裡面有 4 個工序未具體實現,由鞋子製造商去實現,因為只有鞋子製造商才知道鞋子要用什麼材料來做。
下面舉 2 個比較出名的鞋子:Adidas 的 Boost 系列和 Nike 的 Jordan 系列。下面分別實現這 2 個系列鞋子的製造程式碼。
/** * Adidas Boost 鞋製造 */ class AdidasBoostShoeInstall extends ShoeInstallTemplate { @Override public void installSole() { System.out.println("組裝白色 Boost 鞋底"); } @Override public void installInsole() { System.out.println("組裝黑色 Boost 鞋墊"); } @Override public void installVamp() { System.out.println("組裝黑色 Boost 鞋面"); } @Override public void installShoelace() { System.out.println("組裝黑色 Boost 鞋帶"); } } /** * Nike Jordan 鞋製造 */ class NikeJordanShoeInstall extends ShoeInstallTemplate { @Override public void installSole() { System.out.println("組裝黑色 Jordan 鞋底"); } @Override public void installInsole() { System.out.println("組裝黑色 Jordan 鞋墊"); } @Override public void installVamp() { System.out.println("組裝紅色 Jordan 鞋面"); } @Override public void installShoelace() { System.out.println("組裝紅色 Jordan 鞋帶"); } }
實現了製造商製造鞋子的程式碼之後,我們通過程式碼測試怎麼製造 Boost 和 Jordan 鞋子。
public class TemplateMethodTest { public static void main(String[] args) { ShoeInstallTemplate adidasBoost = new AdidasBoostShoeInstall(); adidasBoost.installShot(); ShoeInstallTemplate nikeJordan = new NikeJordanShoeInstall(); nikeJordan.installShot(); } } 列印結果: 組裝一雙鞋,步驟如下: 組裝白色 Boost 鞋底 組裝黑色 Boost 鞋墊 組裝黑色 Boost 鞋面 組裝黑色 Boost 鞋帶 組裝一雙鞋,步驟如下: 組裝黑色 Jordan 鞋底 組裝黑色 Jordan 鞋墊 組裝紅色 Jordan 鞋面 組裝紅色 Jordan 鞋帶
模板方法模式就這麼簡單。是不是掌握了?
總結
模板方法是一個比較實用的模式,為什麼說實用呢?舉個現實的例子,Java 能有如今的發展,離不開各大開源框架,比如 Dubbo,有看過原始碼的朋友就知道,裡面大量程式碼運用了模板方法設計模式,為什麼 Dubbo 可以支援很多種註冊中心?其實本質就是用了模板方法設計模式,使得可以擴充套件多種註冊中心。掌握好模板方法,對讀原始碼有非常大的幫助,很多人包括我在內,在剛開始閱讀原始碼的時候,有相當長的一段時間懷疑人生,怎麼這些程式碼那麼繞?調來調去的。當你瞭解了常用的設計模式之後,看原始碼就可以直截了當的知道是用什麼設計模式,為什麼用這個設計模式?原來是為了什麼什麼。。。 有了這層思考,就像有一條線將以前散落在各地的知識點連線起來,成了可以推敲的知識 。
參考資料:《大話設計模式》、《設計模式之禪》
推薦閱讀:
希望文章對您有所幫助,設計模式系列會持續更新,感興趣的同學可以關注公眾號: LieBrother ,第一時間獲取文章推送閱讀,也可以一起交流,交個朋友。