小編給大家分享一下PHP設計模式之模板方法模式的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
站在用戶的角度思考問題,與客戶深入溝通,找到新昌網(wǎng)站設計與新昌網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋新昌地區(qū)。什么是模板方法模式
模板方法(Template Method)設計模式中使用了一個類方法templateMethod(), 該方法是抽象類中的一個具體方法, 這個方法的作用是對抽象方法序列排序,具體實現(xiàn)留給具體類來完成.關鍵在于模板方法模式定義了操作中算法的"骨架",而由具體類來實現(xiàn).
什么時候使用模板方法
如果已經(jīng)明確算法中的一些步驟, 不過這些步驟可以采用多種不同的方法實現(xiàn), 就可以使用模板方法調試.如果算法中的步驟不變, 可以把這些步驟留給子類具體實現(xiàn).在這種情況下, 可以使用模板方法設計模式來組織抽象類中的基本操作(函數(shù)/方法).然后由子類來實現(xiàn)應用所需的這些操作.
還有一種用法稍微復雜一些, 可能需要把子類共同的行為放在一個類中, 以避免代碼重復.
如果使用多個類來解決同一個大型問題, 可能很快就會出現(xiàn)重復代碼.
還有一點,可以使用模板方法模式控制子類擴展,也就是所謂的"鉤子".
示例
在PHP編程中,可能經(jīng)常會遇到一個問題: 要建立帶圖題的圖像. 這個算法相當簡單, 就是顯示圖像, 然后的圖像下面顯示文本.
由于模板設計中只涉及兩個參與者, 所以這是最容易理解的模式之一, 同時也非常有用. 抽象建立templateMethod()
,并由具體類實現(xiàn)這個方法.
抽象類
抽象類是這里的關鍵, 因為它同時包含具體和抽象方法. 模板方法往往是具體方法, 其操作是抽象的
兩個抽象方法分別是addPicture和addTitile,這兩個操作都包含一個參數(shù), 分別表示圖像的URL信息和圖像標題.
Template.php
<?php abstract class Template { protected $picture; protected $title; public function display($pictureNow, $titleNow) { $this->picture = $pictureNow; $this->title = $titleNow; $this->addPicture($this->picture); $this->addTitle($this->title); } abstract protected function addPicture($picture); abstract protected function addTitle($title); }
具體類
Concrete.php
<?php include_once('Template.php'); class Concrete extends Template { protected function addPicture($picture) { $this->picture = 'picture/' . $picture; echo "圖像路徑為:" . $this->picture . '<br />'; } protected function addTitle($title) { $this->title = $title; echo "<em>標題: </em>" . $this->title . "<br />"; } }
客戶
Client.php
<?php function __autoload($class_name) { include $class_name . '.php'; } class Client { public function __construct() { $title = "chenqionghe is a handsome boy"; $concrete = new Concrete(); $concrete->display('chenqionghe.png', $title); } } $worker = new Client();
$concrete變量實例化了Concrete, 但是它調用了display模板方法, 這是從父類繼承的具體操作, 父類通過display()
調用子類的操作.
運行后輸出
圖像路徑為:picture/chenqionghe.png
標題: chenqionghe is a handsome boy
可以看到,客戶只需要提供圖像地址和標題
模板方法設計模式中的鉤子
有時模板方法函數(shù)可能有一個你不想要的步驟, 某些特定情況下你可能不希望執(zhí)行這個步驟, 這時候就可以用到模板方法的鉤子.
在模板方法設計模式中, 利用鉤子可以將一個方法作為模板的一部分,不過不一定會用到這個方法, 換句話說, 它是方法的一部分,不過它包含一個鉤子, 可以處理例外情況. 子類可以為算法增加一個可選元素, 這樣一來, 盡管仍按模板方法建立的順序執(zhí)行, 但有可能并不完成模板方法期望的動作. 對于這種可選的情況, 鉤子就是解決這個問題最理想的工具.
示例
去網(wǎng)購商品, 登場8折, 如果總商品費用超過200元, 就免去12.95元錢運費.
建立鉤子
在模板方法中建立鉤子方法很有意思, 盡管子類可以改變鉤子的行為, 但仍然要遵循模板中定義的順序
IHook.php
<?php abstract class IHook { protected $hook; protected $fullCost; public function templateMethod($fullCost, $hook) { $this->fullCost = $fullCost; $this->hook = $hook; $this->addGoods(); $this->addShippingHook(); $this->displayCost(); } protected abstract function addGoods(); protected abstract function addShippingHook(); protected abstract function displayCost(); }
這里有3個抽象方法:addGoods()
,addShippingHook()
,displayCost()
, 抽象類IHook實現(xiàn)的templateMethod()
中確定了它們的順序. 在這里, 鉤子方法放在中間, 實際上模板方法指定的順序中, 鉤子可以放在任意位置. 模板方法需要兩個參數(shù), 一個是總花費, 另外還需要一個變量用來確定顧客是否免收運費.
實現(xiàn)鉤子
一旦抽象類中建立了這些抽象方法, 并指定了它們執(zhí)行的順序, 子類將實現(xiàn)所有這3個方法:
Concrete.php
<?php class Concrete extends IHook { protected function addGoods() { $this->fullCost = $this->fullCost * 0.8; } protected function addShippingHook() { if(!$this->hook) { $this->fullCost += 12.95; } } protected function displayCost() { echo "您需要支付: " . $this->fullCost . '元<br />'; } }
addGoods和displayCost都是標準方法, 只有一個實現(xiàn)., 不過, addShippingHook的實現(xiàn)有所不同, 其中有一個條件來確定是否增加運費. 這就是鉤子.
客戶Client
Client.php
<?php function __autoload($class_name) { include $class_name . '.php'; } class Client { private $totalCost; private $hook; public function __construct($goodsTotal) { $this->totalCost = $goodsTotal; $this->hook = $this->totalCost >= 200; $concrete = new Concrete(); $concrete->templateMethod($this->totalCost, $this->hook); } } $worker = new Client(100); $worker = new Client(200);
該Client演示了分別購買100塊錢和200塊錢的商品最后的費用,運行結果如下
您需要支付: 92.95元
您需要支付: 160元
看完了這篇文章,相信你對“PHP設計模式之模板方法模式的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章題目:PHP設計模式之模板方法模式的示例分析-創(chuàng)新互聯(lián)
瀏覽路徑:http://aaarwkj.com/article24/dppcce.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供響應式網(wǎng)站、網(wǎng)站建設、用戶體驗、服務器托管、做網(wǎng)站、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容