模板方法(template method)設計模式中使用了乙個類方法templatemethod(), 該方法是抽象類中的乙個具體方法, 這個方法的作用是對抽象方法序列排序,具體實現留給具體類來完成.關鍵在於模板方法模式定義了操作中演算法的"骨架",而由具體類來實現.
如果已經明確演算法中的一些步驟, 不過這些步驟可以採用多種不同的方法實現, 就可以使用模板方法除錯.如果演算法中的步驟不變, 可以把這些步驟留給子類具體實現.在這種情況下, 可以使用模板方法設計模式來組織抽象類中的基本操作(函式/方法).然後由子類來實現應用所需的這些操作.
還有一種用法稍微複雜一些, 可能需要把子類共同的行為放在乙個類中, 以避免**重複.
如果使用多個類來解決同乙個大型問題, 可能很快就會出現重複**.
還有一點,可以使用模板方法模式控制子類擴充套件,也就是所謂的"鉤子".
在php程式設計中,可能經常會遇到乙個問題: 要建立帶圖題的影象. 這個演算法相當簡單, 就是顯示影象, 然後的影象下面顯示文字.
由於模板設計中只涉及兩個參與者, 所以這是最容易理解的模式之一, 同時也非常有用. 抽象建立templatemethod(),並由具體類實現這個方法.
抽象類是這裡的關鍵, 因為它同時包含具體和抽象方法. 模板方法往往是具體方法, 其操作是抽象的
兩個抽象方法分別是addpicture和addtitile,這兩個操作都包含乙個引數, 分別表示影象的url資訊和影象標題.
template.php
<?phpabstract class template
abstract protected function addpicture($picture);
abstract protected function addtitle($title);
}
concrete.php
<?phpinclude_once('template.php');
class concrete extends template
protected function addtitle($title)
}
client.php
<?phpfunction __autoload($class_name)
class client
}$worker = new client();
$concrete變數例項化了concrete, 但是它呼叫了display模板方法, 這是從父類繼承的具體操作, 父類通過display()呼叫子類的操作.
執行後輸出
影象路徑為:picture/chenqionghe.png
可以看到,客戶只需要提供影象位址和標題
有時模板方法函式可能有乙個你不想要的步驟, 某些特定情況下你可能不希望執行這個步驟, 這時候就可以用到模板方法的鉤子.
在模板方法設計模式中, 利用鉤子可以將乙個方法作為模板的一部分,不過不一定會用到這個方法, 換句話說, 它是方法的一部分,不過它包含乙個鉤子, 可以處理例外情況. 子類可以為演算法增加乙個可選元素, 這樣一來, 儘管仍按模板方法建立的順序執行, 但有可能並不完成模板方法期望的動作. 對於這種可選的情況, 鉤子就是解決這個問題最理想的工具.
去網購商品, 登場8折, 如果總商品費用超過200元, 就免去12.95元錢運費.
在模板方法中建立鉤子方法很有意思, 儘管子類可以改變鉤子的行為, 但仍然要遵循模板中定義的順序
ihook.php
<?phpabstract class ihook
protected abstract function addgoods();
protected abstract function addshippinghook();
protected abstract function displaycost();
}
這裡有3個抽象方法: addgoods(), addshippinghook(),displaycost(), 抽象類ihook實現的templatemethod()中確定了它們的順序. 在這裡, 鉤子方法放在中間, 實際上模板方法指定的順序中, 鉤子可以放在任意位置. 模板方法需要兩個引數, 乙個是總花費, 另外還需要乙個變數用來確定顧客是否免收運費.
一旦抽象類中建立了這些抽象方法, 並指定了它們執行的順序, 子類將實現所有這3個方法:
concrete.php
<?phpclass concrete extends ihook
protected function addshippinghook()
}protected function displaycost()
}
addgoods和displaycost都是標準方法, 只有乙個實現., 不過, addshippinghook的實現有所不同, 其中有乙個條件來確定是否增加運費. 這就是鉤子.
client.php
<?phpfunction __autoload($class_name)
class client
}$worker = new client(100);
$worker = new client(200);
該client演示了分別購買100塊錢和200塊錢的商品最後的費用,執行結果如下
您需要支付: 92.95元您需要支付: 160元
模板設計模式 PHP設計模式之模板方法模式
模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...
設計模式之模板方法設計模式
父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...
設計模式之模板方法模式
定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟 型別 行為類模式 事實上,模板方法是程式設計中乙個經常用到的模式。比如,給定乙個整數陣列,把陣列中的數由大到小順序,然後把排序之後的結果列印出來。這個需求大體可以分為兩部分,...