學習php設(shè)計模式 php實現(xiàn)模板方法模式
一、意圖
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method 使得子類可以在不改變一個算法的結(jié)構(gòu)的情況下重定義該算法的某些特定的步驟【GOF95】
二、模板方法模式結(jié)構(gòu)圖
三、模板方法模式中主要角色
抽象模板(AbstractClass)角色: 定義一個或多個抽象方法讓子類實現(xiàn)。這些抽象方法叫做基本操作,它們是頂級邏輯的組成部分。
定義一個模板方法。這個模板方法一般是一個具體方法,它給出頂級邏輯的骨架,而邏輯的組成步驟在對應的抽象操作中,這些操作將會推遲到子類中實現(xiàn)。同時,頂層邏輯也可以調(diào)用具體的實現(xiàn)方法
具體模板(ConcrteClass)角色:實現(xiàn)父類的一個或多個抽象方法,作為頂層邏輯的組成而存在。
每個抽象模板可以有多個具體模板與之對應,而每個具體模板有其自己對抽象方法(也就是頂層邏輯的組成部分)的實現(xiàn),從而使得頂層邏輯的實現(xiàn)各不相同。
四、模板方法模式適用場景
1、一次性實現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實現(xiàn)。
2、各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。
3、控制子類擴展。
五、模板方法模式與其它模式
1、策略模式(strategy模式):模板方法使用繼承來改變算法的部分,策略模式使用委托來改變整個算法。區(qū)別在于封閉的變化不同,一個變化的部分,一個變化的是整體。
2、工廠方法模式(factory method模式):Factory Method模式常被模板方法調(diào)用。
六、模板方法模式PHP示例
<?php /** * 抽象模板角色 * 定義抽象方法作為頂層邏輯的組成部分,由子類實現(xiàn) * 定義模板方法作為頂層邏輯的架子,調(diào)用基本方法組裝頂層邏輯 */ abstract class AbstractClass { /** * 模板方法 調(diào)用基本方法組裝頂層邏輯 */ 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(); } /** * 具體模板角色 * 實現(xiàn)父類的抽象方法 */ 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(); ?>
七、模板方法模式
模板方法是一種代碼復用的基本技術(shù),模板方法導致一種反射的控制結(jié)構(gòu),這指的是一個父類調(diào)用子類的操作。
其實現(xiàn)過程:準備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。
八、重構(gòu)的原則
重構(gòu)時應當遵守的原則是:將行為以是移到結(jié)構(gòu)的高端,而將狀態(tài)盡量移動到結(jié)構(gòu)的低端。
1、應當要所行為而不是狀態(tài)定義一個類。
2、在實現(xiàn)行為是,是用抽象狀態(tài)而不是用具體狀態(tài)。
3、給操作劃分層次。
4、將狀態(tài)的確認推遲到子類中。在父類中,如果需要狀態(tài)屬性的話,可以調(diào)用抽象的取值方法,而將抽象的取值方法的實現(xiàn)放到具體子類中。
如果可以遵守以上的而,那么就可以在等級結(jié)構(gòu)中將接口與實現(xiàn)分離,將抽象與具體分離,從而保證代碼可以最大限度的被復用。
以上就是使用php實現(xiàn)模板方法模式的代碼,還有一些關(guān)于模板方法模式的概念區(qū)分,希望對大家的學習有所幫助。
相關(guān)文章
PHP實現(xiàn)根據(jù)數(shù)組某個鍵值大小進行排序的方法
這篇文章主要介紹了PHP實現(xiàn)根據(jù)數(shù)組某個鍵值大小進行排序的方法,涉及php針對數(shù)組的遍歷、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03

php下mysql數(shù)據(jù)庫操作類(改自discuz)

PHP面向?qū)ο蟪绦蛟O(shè)計之接口的繼承定義與用法詳解

PHP實現(xiàn)將多個文件中的內(nèi)容合并為新文件的方法示例

PHP基于遞歸實現(xiàn)的約瑟夫環(huán)算法示例

PHP5.6新增加的可變函數(shù)參數(shù)用法分析