一、意圖
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method 使得子類可以在不改變一個算法的結構的情況下重定義該算法的某些特定的步驟【GOF95】
二、模板方法模式結構圖
三、模板方法模式中主要角色
抽象模板(AbstractClass)角色: 定義一個或多個抽象方法讓子類實現。這些抽象方法叫做基本操作,它們是頂級邏輯的組成部分。
定義一個模板方法。這個模板方法一般是一個具體方法,它給出頂級邏輯的骨架,而邏輯的組成步驟在對應的抽象操作中,這些操作將會推遲到子類中實現。同時,頂層邏輯也可以調用具體的實現方法
具體模板(ConcrteClass)角色:實現父類的一個或多個抽象方法,作為頂層邏輯的組成而存在。
每個抽象模板可以有多個具體模板與之對應,而每個具體模板有其自己對抽象方法(也就是頂層邏輯的組成部分)的實現,從而使得頂層邏輯的實現各不相同。
四、模板方法模式適用場景
1、一次性實現一個算法的不變的部分,並將可變的行為留給子類來實現。
2、各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重復。
3、控制子類擴展。
五、模板方法模式與其它模式
1、策略模式(strategy模式):模板方法使用繼承來改變算法的部分,策略模式使用委托來改變整個算法。區別在於封閉的變化不同,一個變化的部分,一個變化的是整體。
2、工廠方法模式(factory method模式):Factory Method模式常被模板方法調用。
六、模板方法模式PHP示例
<?php /** * 抽象模板角色 * 定義抽象方法作為頂層邏輯的組成部分,由子類實現 * 定義模板方法作為頂層邏輯的架子,調用基本方法組裝頂層邏輯 */ abstract class AbstractClass { /** * 模板方法 調用基本方法組裝頂層邏輯 */ public function templateMethod() { echo 'templateMethod begin.<br />'; $this->primitiveOperation1(); $this->primitiveOperation2(); echo 'templateMethod end.<br />'; } /** * 基本方法1 */ abstract protected function primitiveOperation1(); /** * 基本方法2 */ abstract protected function primitiveOperation2(); } /** * 具體模板角色 * 實現父類的抽象方法 */ class ConcreteClass extends AbstractClass{ /** * 基本方法1 */ protected function primitiveOperation1() { echo 'primitiveOperation1<br />'; } /** * 基本方法2 */ protected function primitiveOperation2(){ echo 'primitiveOperation2<br />'; } } /** * 客戶端 */ class Client { /** * Main program. */ public static function main() { $class = new ConcreteClass(); $class->templateMethod(); } } Client::main(); ?>
七、模板方法模式
模板方法是一種代碼復用的基本技術,模板方法導致一種反射的控制結構,這指的是一個父類調用子類的操作。
其實現過程:准備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。
八、重構的原則
重構時應當遵守的原則是:將行為以是移到結構的高端,而將狀態盡量移動到結構的低端。
1、應當要所行為而不是狀態定義一個類。
2、在實現行為是,是用抽象狀態而不是用具體狀態。
3、給操作劃分層次。
4、將狀態的確認推遲到子類中。在父類中,如果需要狀態屬性的話,可以調用抽象的取值方法,而將抽象的取值方法的實現放到具體子類中。
如果可以遵守以上的而,那麼就可以在等級結構中將接口與實現分離,將抽象與具體分離,從而保證代碼可以最大限度的被復用。
以上就是使用php實現模板方法模式的代碼,還有一些關於模板方法模式的概念區分,希望對大家的學習有所幫助。