Android 設計模式之模板方法模式,android設計模式
模板方法模式的定義:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
設計原則:別調用我們,我會調用你,(就好比獵頭和求職者,求職者不需要去找獵頭,獵頭只要有工作就會找到你)稱之為好萊塢原則
引用一個例子,一個店中有兩飲料:咖啡和茶,他們的沖泡方法
第一步:都是要用沸水
第二步:用熱水泡咖啡或茶
第三步:把飲料倒進杯子
第四步:在飲料中加入適當的調料
在上面的步驟中一、三是一樣的,可以抽取出來放在基類中,二、四不一樣,可以抽象出來,讓子類去實現,以下是飲料抽象的父類,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情;可以加一個鉤子函數:custcomerWantsCondiments(),請子類去重寫。
CoffeineBeverageWithHook.java
package com.dzt.template;/** * 由於有的客戶有可能不需要調料,這時就需要讓客戶去選擇是否來添加調料,需要 * * @author Administrator * */public abstract class CoffeineBeverageWithHook {void prepareRecipe() {boilWater();brew();pourInCup();if (custcomerWantsCondiments())addCondiments();}abstract void brew(); // 沖泡abstract void addCondiments(); // 添加調料// 燒開水void boilWater() {System.out.println("CoffeineBeverageWithHook-------------------->boilWater");}// 把飲料倒進杯子void pourInCup() {System.out.println("CoffeineBeverageWithHook-------------------->pourInCup");}/** * 子類可以重載這個函數 * * @return */boolean custcomerWantsCondiments() {return true;}}
以下是咖啡類,繼承了上面的飲料父類
CoffeineWithHook.java
package com.dzt.template;public class CoffeineWithHook extends CoffeineBeverageWithHook {@Overridevoid brew() {// TODO Auto-generated method stubSystem.out.println("CoffeineWithHook-------------------->brew");}@Overridevoid addCondiments() {// TODO Auto-generated method stubSystem.out.println("CoffeineWithHook-------------------->addCondiments");}@Overrideboolean custcomerWantsCondiments() {// TODO Auto-generated method stubreturn false;}}
以下是茶類,繼承了上面的飲料父類
TeaWithHook.java
package com.dzt.template;public class TeaWithHook extends CoffeineBeverageWithHook {@Overridevoid brew() {// TODO Auto-generated method stubSystem.out.println("TeaWithHook-------------------->brew");}@Overridevoid addCondiments() {// TODO Auto-generated method stubSystem.out.println("TeaWithHook-------------------->addCondiments");}@Overrideboolean custcomerWantsCondiments() {// TODO Auto-generated method stubreturn true;}}
以上代碼可以去修改custcomerWantsCondiments()函數,由使用者決定是否需要添加調料
測試代碼
package com.dzt.template;/** * 模板方法模式 在模板方法中添加鉤子方法,讓使用者決定 * * @author Administrator * @date 2014.08.20 */public class TemplateMain {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubCoffeineWithHook coffHook = new CoffeineWithHook();TeaWithHook teaHook = new TeaWithHook();coffHook.prepareRecipe();System.out.println("---------------------------------------------------------------");teaHook.prepareRecipe();}}
總結:
1、模板方法是一種代碼複用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公用行為。
2、模板方法導致一種方向控制結構,"好萊塢法則":"Don't call me,i will call you.",即一個父類調用子類的操作,而不是相反。
3、模板叫用作業的類型有具體的操作,具體的AbstracClass操作,原語操作,Factory 方法,鉤子操作。少定義原語操作。
4、模板方法使用繼承來改變演算法的一部分。策略模式使用委託來改變整個演算法。
相關代碼:http://download.csdn.net/detail/deng0zhaotai/7835511
參考書籍:《Head First 設計模式》
軟體設計模式之模板模式的好處是什?
模板方法模式(Template Method Pattern),定義一個操作中的演算法骨架,而將一些實現步驟延遲到子類當中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
模板方法模式是比較簡單的一種設計模式,但是它卻是代碼複用的一項基本的技術,在類庫中尤其重要,它遵循“抽象類別應當擁有儘可能多的行為,應當擁有儘可能少的資料”的重構原則。作為模板的方法要定義在父類中,在方法的定義中使用到抽象方法,而只看父類的抽象方法是根本不知道怎樣處理的,實際做具體處理的是子類,在子類中實現具體功能,因此不同的子類執行將會得出不同的實現結果,但是處理流程還是按照父類定製的方式。這就是模板方法的要義所在,制定演算法骨架,讓子類具體實現。
推薦你一本設計模式方面的優秀書籍:鄭阿奇 主編的《軟體秘笈-設計模式那點事》。裡面講解很到位,執行個體通俗易懂,看了收穫很大!
祝你早日學會設計模式!
哪位大俠可以給幾個設計模式中模板方法在實際中應用例子,感激
目前流行的EJB模型就是一個典型的應用例子,它從應用技術實現的角度對模型做三、MVC設計模式的擴充 通過在ASP.NET中的MVC模式編寫的,具有極其良好的可