一、概述
模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
二、結構類圖
三、解決問題
模板方法就是提供乙個演算法框架,框架裡面的步驟有些是父類已經定好的,有些需要子類自己實現。相當於要去辦一件事情,行動的流程已經定好了,但有些步驟需要自己去做,而有些步驟可能別人幫我們做了。就拿建**來說,一般的程式是購買網域名稱-->購買空間-->上傳**-->備案-->審核,每個**的建立必須經過這樣的固定程式,但除了審核不用建站者關心,其他的步驟都要建站者自己去完成。
四、應用例項
現在我們很多家庭都有了豆漿機,豆漿的營養價值不用我多說了。製作豆漿的程式簡單點來說就是選材--->新增配料--->浸泡--->放到豆漿機打碎,通過新增不同的配料,可以製作出不同口味的豆漿,但是選材、浸泡和放到豆漿機打碎這幾個步驟對於製作每種口味的豆漿都是一樣的。
1、建立抽象類
package templatemethod.pattern;2、建立紅棗豆漿//豆漿類,抽象類
public abstract class soyamilk
//選材方法,選擇黃豆
void selectmaterial()
//可以新增不同的配料,在這裡設定為抽象方法,子類必須實現
abstract void addcondiments();
//浸泡
void soak()
//放到豆漿機打碎
void beat()
}
package templatemethod.pattern;3、建立核桃豆漿//紅棗豆漿
public class reddatessoyamilk extends soyamilk
}
package templatemethod.pattern;4、測試製作豆漿//核桃豆漿
public class nutsoyamilk extends soyamilk
}
package templatemethod.pattern;執行結果:public class soyamilktest
}
五、優缺點
1、優點
(1)、演算法只存在於乙個地方,也就是在父類中,容易修改。需要修改演算法時,只要修改父類的模板方法或者已經實現的某些步驟,子類就會繼承這些修改。
(2)、實現了最大化**復用。父類的模板方法和已實現的某些步驟會被子類繼承而直接使用。
(3)、既統一了演算法,也提供了很大的靈活性。父類的模板方法確保了演算法的結構保持不變,同時由子類提供部分步驟的實現。
(4)、提供了乙個基本框架,容易擴充套件子類。模板方法有框架控制如何做事情,而由使用框架的人指定框架演算法中每個步驟的細節。子類只要繼承父類,實現抽象方法,就可以使用父類的演算法。
2、缺點
(1)、模板方法使用繼承方式復用**,如果要在基本演算法裡面增加乙個步驟,而該步驟是抽象的話,每個子類都要修改**,實現這個步驟。
六、模板方法中的鉤子方法
在模板方法模式的父類中,我們可以定義乙個方法,它預設不做任何事,子類可以視情況要不要覆蓋它,該方法稱為「鉤子」。我們還是用上面做豆漿的例子來講解。
1、建立有鉤子方法的父類
package templatemethod.pattern;2、建立純豆漿子類//豆漿類,抽象類
public abstract class soyamilkwithhook
soak();
beat(); }
//選材方法,選擇黃豆
void selectmaterial()
//可以新增不同的配料,在這裡設定為抽象方法,子類必須實現
abstract void addcondiments();
//浸泡
void soak()
//放到豆漿機打碎
void beat()
//鉤子方法,是否新增配料
boolean customerwantscondiments()
}
package templatemethod.pattern;3、測試製作純豆漿//製作純豆漿,不新增任何配料
public class puresoyamilk extends soyamilkwithhook
//覆蓋鉤子方法,不新增配料
@override
boolean customerwantscondiments()
}
package templatemethod.pattern;測試結果:public class puresoyamilktest
}
鉤子方法的作用
1、讓子類實現演算法中的可選部分。演算法中的某些步驟是可選的,子類可以做出決定是否需要這些步驟。
2、如果鉤子對於子類的實現不重要時,子類可以對鉤子置之不理。
3、鉤子可以讓子類能夠有機會對模板方法中某些即將發生的(或剛剛發生的)步驟作出反應。可以在鉤子中實現我們對於某個步驟執行需要作出的動作,模板方法的某個步驟執行時,呼叫鉤子。
七、模板方法與策略的比較
1、相同點
(1)、都封裝了演算法。
2、不同點
(1)、策略使用組合方式實現演算法,客戶可以自由選擇演算法;模板方法使用繼承方式獲得演算法,確保演算法的基本結構不變。
(2)、策略**復用程度低,每個演算法都要對應乙個類;模板方法**復用高,子類可以繼承父類的**。
(3)、策略依賴少,自己實現整個演算法;模板方法依賴高,子類依賴父類中的方法的實現。
八、使用場景
1、當要完成一件事情,它有固定的程式流程,但某些步驟是自定義的,使用模板方法。
2、當需要建立框架時,在超類中提供乙個基礎的方法,達到**的復用,並允許子類指定行為。
設計模式之十 模板方法模式
感覺就是父類中定義個方法的介面,讓子類去具體實現,每個子類的實現方式都不一樣。既然用了繼承,並且肯定這個繼承有意義,就應該要成為子類的模板,所有重複的 都應該要上公升到父類去,而不是讓每個子類都去重複。當我們要完成在某一細節層次一致的乙個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時...
設計模式(十) 模板模式
模板模式通常又叫模板方法模式 template method pattern 是指定義乙個演算法的骨架,並允許子類為乙個或多個步驟提供實現。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟,屬於行為性設計模式。比如購買商品一般都有固定的流程,比如先檢視庫存,然後生成訂單,折扣...
模式十 模板方法模式
10.1 模板方法模式定義 在乙個方法中定義乙個演算法的框架,而將一些步驟延遲到子類中。模板方法可以使得子類在不改變演算法結構的情況下,重新定義演算法中的某些步驟。10.2 模板方法模式 uml類圖 模式方法的定義 void templatemethod 模式方法不能宣告成 virtual 是因為當...