PHP模板方法模式使用詳解

來源:互聯網
上載者:User
這次給大家帶來PHP模板方法模式使用詳解,PHP模板方法模式使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

什麼是模板方法模式

模板方法(Template Method)設計模式中使用了一個類方法templateMethod(), 該方法是抽象類別中的一個具體方法, 這個方法的作用是對抽象方法序列排序,具體實現留給具體類來完成.關鍵在於模板方法模式定義了操作中演算法的"骨架",而由具體類來實現.

什麼時候使用模板方法

如果已經明確演算法中的一些步驟, 不過這些步驟可以採用多種不同的方法實現, 就可以使用模板方法調試.如果演算法中的步驟不變, 可以把這些步驟留給子類具體實現.在這種情況下, 可以使用模板方法設計模式來組織抽象類別中的基本操作(函數/方法).然後由子類來實現應用所需的這些操作.

還有一種用法稍微複雜一些, 可能需要把子類共同的行為放在一個類中, 以避免代碼重複.

如果使用多個類來解決同一個大型問題, 可能很快就會出現重複代碼.

還有一點,可以使用模板方法模式控制子類擴充,也就是所謂的"鉤子".

樣本

在PHP編程中,可能經常會遇到一個問題: 要建立帶圖題的映像. 這個演算法相當簡單, 就是顯示映像, 然後的映像下面顯示文本.

由於模板設計中只涉及兩個參與者, 所以這是最容易理解的模式之一, 同時也非常有用. 抽象建立templateMethod(),並由具體類實現這個方法.

抽象類別

抽象類別是這裡的關鍵, 因為它同時包含具體和抽象方法. 模板方法往往是具體方法, 其操作是抽象的

兩個抽象方法分別是addPicture和addTitile,這兩個操作都包含一個參數, 分別表示映像的URL資訊和映像標題.

Template.php

<?phpabstract 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

<?phpinclude_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

<?phpfunction 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

可以看到,客戶只需要提供映像地址和標題

模板方法設計模式中的鉤子

有時模板方法函數可能有一個你不想要的步驟, 某些特定情況下你可能不希望執行這個步驟, 這時候就可以用到模板方法的鉤子.

在模板方法設計模式中, 利用鉤子可以將一個方法作為模板的一部分,不過不一定會用到這個方法, 換句話說, 它是方法的一部分,不過它包含一個鉤子, 可以處理例外情況. 子類可以為演算法增加一個可選元素, 這樣一來, 儘管仍按模板方法建立的順序執行, 但有可能並不完成模板方法期望的動作. 對於這種可選的情況, 鉤子就是解決這個問題最理想的工具.

樣本

去網購商品, 登場8折, 如果總商品費用超過200元, 就免去12.95元錢運費.

建立鉤子

在模板方法中建立鉤子方法很有意思, 儘管子類可以改變鉤子的行為, 但仍然要遵循模板中定義的順序

IHook.php

<?phpabstract 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實現的templateMethod()中確定了它們的順序. 在這裡, 鉤子方法放在中間, 實際上模板方法指定的順序中, 鉤子可以放在任意位置. 模板方法需要兩個參數, 一個是總花費, 另外還需要一個變數用來確定顧客是否免收運費.

實現鉤子

一旦抽象類別中建立了這些抽象方法, 並指定了它們執行的順序, 子類將實現所有這3個方法:

Concrete.php

<?phpclass 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都是標準方法, 只有一個實現., 不過, addShippingHook的實現有所不同, 其中有一個條件來確定是否增加運費. 這就是鉤子.

客戶Client

Client.php

<?phpfunction 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中文網其它相關文章!

推薦閱讀:

PHP介面隔離原則(ISP)使用案例解析

PHP依賴倒置案例詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.