<大話設計模式>本教程說明及著作權聲明
國士工作室是一支專註於Android平台企業級應用開發的技術團隊,致力於做中國最棒的Android應用程式開發機構,提供最棒的Android企業級應用開發培訓服務。
企業培訓和開發合作官方連絡方式:
電話:18610086859
Email:hiheartfirst@gmail.com
QQ:1740415547
QQ群:148325348
國士工作室 有你更美好!
l 該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。
l 如果對該文檔有任何疑問或者建議,請進入官方部落格
http://www.cnblogs.com/guoshiandroid/留言或者直接與國士工作室聯絡(後附連絡方式),我們會謹慎參考您的建議並根據需要對本文檔進行修改,以造福更多開發人員!
l 《大話設計模式》的最新及完整內容會在國士工作室官方部落格定期更新,請訪問國士工作室部落格
http://www.cnblogs.com/guoshiandroid/擷取更多更新內容。
模板方法模式 人的一生應該這樣度過
模板方法模式應用情境舉例:
有一天GG和MM非常認真的說,人的一生基本分為以下幾個階段:
幼年階段:幼年時期的人主要學校任務是學習講話。
兒童階段:人要進行基礎的學習。
少年階段:人仍然主要是學習,而且學習的難度加大了。
青年階段:學習和工作。
中年階段:主要是總結以前的學習,並且從中學到更多的知識。
老年階段:老人需要平靜和學習,學習會是老年人延緩衰老。
GG說,每一個人生階段都有自己的特點和應該做的事情,我們倆現在都處於青年階段初期,要好好學習啊,當然了也要好好的珍惜我的真情,因為明天不可預測,所以我們今天要全力相愛^_^
模板方法模式解釋:
模板方法模式(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.。
模板方法模式的UML圖:
模板方法模式所涉及的角色如下:
抽象類別(AbstractClass):定義了一到多個的抽象方法,以供具體的子類來實現它們;而且還要實現一個模板方法,來定義一個演算法的骨架。該模板方法不僅調用前面的抽象方法,也可以調用其他的操作,只要能完成自身的使命。
具體類(ConcreteClass):實現父類中的抽象方法以完成演算法中與特定子類相關的步驟。
組合模式的UML圖如下 所示:
模板方法模式深入分析:
有人說,如果你只會一個設計模式的話,那麼這個設計模式就一定是模板方法模式。
模板方法模式是一種非常簡單的設計模式,但是也應用非常廣泛的設計模式。模板方法模式採用繼承的方式實現演算法的異構,其關鍵點就是將通用演算法封裝在抽象基類中,並將不同的演算法細節放到子類中實現。
模板方法模式獲得一種反向控制結構的效果,這也是物件導向系統的分析和設計中一個原則DIP(依賴倒置:Dependency Inversion
Principles)。其含義就是父類調用子類的操作(高層模組調用低層模組的操作),低層模組實現高層模組聲明的介面。這樣控制權在父類(高層模組),低層模組反而要依賴高層模組。
模板方法模式使用情境分析及代碼實現:
在上面的使用情境中,人的一生可以看著抽象類別,而MM和GG就是具體類了。UML圖如下所示:
建立抽象模板:
package com.diermeng.designPattern.TemplateMethod; /* * 人的一生 */ public abstract class Life { //幼年時期 public abstract void babyhood(); //童年時期 public abstract void childhood(); //少年時期 public abstract void youngster(); //幼年時期 public abstract void youth(); //童年時期 public abstract void middle(); //少年時期 public abstract void elderly(); public void live() { this.babyhood(); this.childhood(); this.youngster(); this.youth(); this.middle(); this.elderly(); } } |
建立GG具體類:
package com.diermeng.designPattern.TemplateMethod.impl; import com.diermeng.designPattern.TemplateMethod.Life; /* * GG的模板實現 */ public class GG extends Life { public void childhood() { System.out.println("GG:兒童階段的人要進行基礎的學習。"); } public void babyhood() { System.out.println("GG:幼年階段的人主要學校任務是學習講話。"); } public void youngster() { System.out.println("GG:少年階段的人仍然主要是學習,而且學習的難度加大了。"); } public void elderly() { System.out.println("GG:老年階段老人需要平靜和學習,學習會是老年人延緩衰老。"); } public void middle() { System.out.println("GG:中年階段主要是總結以前的學習,並且從中學到更多的知識。"); } public void youth() { System.out.println("GG:青年階段的主要任務學習和工作。"); } } |
建立MM具體類:
package com.diermeng.designPattern.TemplateMethod.impl; import com.diermeng.designPattern.TemplateMethod.Life; /* * MM的模板實現 */ public class MM extends Life { public void childhood() { System.out.println("MM:兒童階段的人要進行基礎的學習。"); } public void babyhood() { System.out.println("MM:幼年階段的人主要學校任務是學習講話。"); } public void youngster() { System.out.println("MM:少年階段的人仍然主要是學習,而且學習的難度加大了。"); } public void elderly() { System.out.println("MM:老年階段老人需要平靜和學習,學習會是老年人延緩衰老。"); } public void middle() { System.out.println("MM:中年階段主要是總結以前的學習,並且從中學到更多的知識。"); } public void youth() { System.out.println("MM:青年階段的主要任務學習和工作。"); } } |
建立一個測試用戶端:
package com.diermeng.designPattern.TemplateMethod.client; import com.diermeng.designPattern.TemplateMethod.Life; import com.diermeng.designPattern.TemplateMethod.impl.GG; import com.diermeng.designPattern.TemplateMethod.impl.MM; /* * 測試用戶端 */ public class TemplateMethodTest { public static void main(String[] args) { System.out.println("-----------------------------------------------------"); Life gg = new GG(); gg.live(); System.out.println("-----------------------------------------------------"); Life mm = new MM(); mm.live(); System.out.println("-----------------------------------------------------"); } } |
運行結果如下:
----------------------------------------------------- GG:幼年階段的人主要學校任務是學習講話。 GG:兒童階段的人要進行基礎的學習。 GG:少年階段的人仍然主要是學習,而且學習的難度加大了。 GG:青年階段的主要任務學習和工作。 GG:中年階段主要是總結以前的學習,並且從中學到更多的知識。 GG:老年階段老人需要平靜和學習,學習會是老年人延緩衰老。 ----------------------------------------------------- MM:幼年階段的人主要學校任務是學習講話。 MM:兒童階段的人要進行基礎的學習。 MM:少年階段的人仍然主要是學習,而且學習的難度加大了。 MM:青年階段的主要任務學習和工作。 MM:中年階段主要是總結以前的學習,並且從中學到更多的知識。 MM:老年階段老人需要平靜和學習,學習會是老年人延緩衰老。 ----------------------------------------------------- |
模板方法模式的優缺點分析:
優點:
使用模板方法模式,在定義演算法的骨架的同時,可以很靈活地實現具體的演算法,滿足使用者靈活多變的需求
缺點:
雖然使用模板方法模式可以很自由的實現具體的演算法,但如果演算法的骨架有改變的話,這需要改變抽象類別。
模板方法模式的實際應用簡介:
模板模式適用於以下的情況:
第一:一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現。
第二:各子類中公用的行為應被提取出來並集中到一個公用父類中以避免代碼重複。其實這可以說是一種好的編碼習慣了。
第三:控制子類擴充。模板方法只在特定點叫用作業,這樣就只允許在這些點進行擴充。如果你不願子類來修改你的模板方法定義的架構,你可以採用兩種方式來做:一是在API中不體現出你的模板方法;二、將你的模板方法置為final就可以了。可以看出,使用模板方法模式可以將代碼的公用行為提取出來,達到複用的目的。而且,在模板方法模式中,是由父類的模板方法來控制子類中的具體實現。這樣你在實現子類的時候,根本不需要對商務程序有太多的瞭解。
溫馨提示:
模板方法模式是一種運用非常廣泛的設計模式,在Servlet和很多著名的架構中都有大量的應用。一般而且,在我們使用架構的時候,往往都是架構給我們實現設計好了演算法骨架,同時也實現了一些事務、許可權控制等,我們要做的就是按照事先規劃好的流程,實現相應的業務方法。
對人的一生而言,每個階段都有自己的重心,對GG和MM而言,肯定是應該好好學習的。同時,二人應該努力的相愛。韶華易逝啊O(∩_∩)O哈哈~