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

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

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

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

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

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