PHP設(shè)計(jì)模式之模板方法模式的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下PHP設(shè)計(jì)模式之模板方法模式的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到新昌網(wǎng)站設(shè)計(jì)與新昌網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋新昌地區(qū)。

什么是模板方法模式

模板方法(Template Method)設(shè)計(jì)模式中使用了一個(gè)類方法templateMethod(), 該方法是抽象類中的一個(gè)具體方法, 這個(gè)方法的作用是對(duì)抽象方法序列排序,具體實(shí)現(xiàn)留給具體類來(lái)完成.關(guān)鍵在于模板方法模式定義了操作中算法的"骨架",而由具體類來(lái)實(shí)現(xiàn).

什么時(shí)候使用模板方法

如果已經(jīng)明確算法中的一些步驟, 不過(guò)這些步驟可以采用多種不同的方法實(shí)現(xiàn), 就可以使用模板方法調(diào)試.如果算法中的步驟不變, 可以把這些步驟留給子類具體實(shí)現(xiàn).在這種情況下, 可以使用模板方法設(shè)計(jì)模式來(lái)組織抽象類中的基本操作(函數(shù)/方法).然后由子類來(lái)實(shí)現(xiàn)應(yīng)用所需的這些操作.

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

如果使用多個(gè)類來(lái)解決同一個(gè)大型問(wèn)題, 可能很快就會(huì)出現(xiàn)重復(fù)代碼.

還有一點(diǎn),可以使用模板方法模式控制子類擴(kuò)展,也就是所謂的"鉤子".

示例

在PHP編程中,可能經(jīng)常會(huì)遇到一個(gè)問(wèn)題: 要建立帶圖題的圖像. 這個(gè)算法相當(dāng)簡(jiǎn)單, 就是顯示圖像, 然后的圖像下面顯示文本.

由于模板設(shè)計(jì)中只涉及兩個(gè)參與者, 所以這是最容易理解的模式之一, 同時(shí)也非常有用. 抽象建立templateMethod(),并由具體類實(shí)現(xiàn)這個(gè)方法.

抽象類

抽象類是這里的關(guān)鍵, 因?yàn)樗瑫r(shí)包含具體和抽象方法. 模板方法往往是具體方法, 其操作是抽象的

兩個(gè)抽象方法分別是addPicture和addTitile,這兩個(gè)操作都包含一個(gè)參數(shù), 分別表示圖像的URL信息和圖像標(biāo)題.

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>標(biāo)題: </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變量實(shí)例化了Concrete, 但是它調(diào)用了display模板方法, 這是從父類繼承的具體操作, 父類通過(guò)display()調(diào)用子類的操作.

運(yùn)行后輸出

圖像路徑為:picture/chenqionghe.png
標(biāo)題: chenqionghe is a handsome boy

可以看到,客戶只需要提供圖像地址和標(biāo)題

模板方法設(shè)計(jì)模式中的鉤子

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

在模板方法設(shè)計(jì)模式中, 利用鉤子可以將一個(gè)方法作為模板的一部分,不過(guò)不一定會(huì)用到這個(gè)方法, 換句話說(shuō), 它是方法的一部分,不過(guò)它包含一個(gè)鉤子, 可以處理例外情況. 子類可以為算法增加一個(gè)可選元素, 這樣一來(lái), 盡管仍按模板方法建立的順序執(zhí)行, 但有可能并不完成模板方法期望的動(dòng)作. 對(duì)于這種可選的情況, 鉤子就是解決這個(gè)問(wèn)題最理想的工具.

示例

去網(wǎng)購(gòu)商品, 登場(chǎng)8折, 如果總商品費(fèi)用超過(guò)200元, 就免去12.95元錢運(yùn)費(fèi).

建立鉤子

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

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個(gè)抽象方法:addGoods(),addShippingHook(),displayCost(), 抽象類IHook實(shí)現(xiàn)的templateMethod()中確定了它們的順序. 在這里, 鉤子方法放在中間, 實(shí)際上模板方法指定的順序中, 鉤子可以放在任意位置. 模板方法需要兩個(gè)參數(shù), 一個(gè)是總花費(fèi), 另外還需要一個(gè)變量用來(lái)確定顧客是否免收運(yùn)費(fèi).

實(shí)現(xiàn)鉤子

一旦抽象類中建立了這些抽象方法, 并指定了它們執(zhí)行的順序, 子類將實(shí)現(xiàn)所有這3個(gè)方法:

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都是標(biāo)準(zhǔn)方法, 只有一個(gè)實(shí)現(xiàn)., 不過(guò), addShippingHook的實(shí)現(xiàn)有所不同, 其中有一個(gè)條件來(lái)確定是否增加運(yùn)費(fèi). 這就是鉤子.

客戶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演示了分別購(gòu)買100塊錢和200塊錢的商品最后的費(fèi)用,運(yùn)行結(jié)果如下

您需要支付: 92.95元
您需要支付: 160元

看完了這篇文章,相信你對(duì)“PHP設(shè)計(jì)模式之模板方法模式的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

文章題目:PHP設(shè)計(jì)模式之模板方法模式的示例分析-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article24/dppcce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站網(wǎng)站建設(shè)、用戶體驗(yàn)、服務(wù)器托管、做網(wǎng)站、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)