亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP設計模式之模板方法模式定義與用法詳解

2024-05-05 00:03:00
字體:
來源:轉載
供稿:網友

本文實例講述了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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲黄一区二区| 久久久亚洲精选| 日韩高清电影好看的电视剧电影| 欧美黑人一级爽快片淫片高清| 欧美性猛交xxxx富婆| 亚洲高清一二三区| 欧美成人精品三级在线观看| 亚洲天堂成人在线视频| 国产精品高清免费在线观看| 国产91精品久久久久| 欧美日韩免费网站| 日韩av综合网| 亚洲第五色综合网| 国产午夜精品全部视频在线播放| 国产999视频| 亚洲精品在线视频| 国产成人极品视频| 亚洲高清久久网| 成人激情视频网| 97av在线视频| 亚洲人成网站免费播放| 欧美激情国产精品| 91国产精品视频在线| 色偷偷噜噜噜亚洲男人的天堂| 97在线视频国产| 亚洲成色777777女色窝| 国产精品一香蕉国产线看观看| 久久夜色精品国产欧美乱| 精品久久久久久久久中文字幕| 日本国产精品视频| 欧美日韩成人在线观看| 欧美日本啪啪无遮挡网站| 影音先锋欧美在线资源| 欧美日韩在线观看视频| 日本免费一区二区三区视频观看| 欧美在线播放视频| 亚洲一区美女视频在线观看免费| 欧美猛男性生活免费| 日韩av日韩在线观看| 久久精品视频网站| 欧美黄色三级网站| 欧美激情在线一区| 4k岛国日韩精品**专区| 日韩欧美在线视频日韩欧美在线视频| 亚洲电影免费观看高清完整版| 欧美疯狂做受xxxx高潮| 日韩精品视频免费在线观看| 国产精品香蕉在线观看| 欧美特黄级在线| 人妖精品videosex性欧美| 国产综合色香蕉精品| 欧美激情精品在线| 欧美精品激情视频| 亚洲精品ady| 中文字幕亚洲色图| 91亚洲永久免费精品| 国产精品久久一区| 狠狠色狠狠色综合日日小说| 亚洲精品免费在线视频| 日韩中文在线中文网在线观看| 精品国产一区二区三区久久久| 亚洲成人久久网| 日韩av片免费在线观看| 久久久午夜视频| 国产小视频国产精品| 91sa在线看| 久久久免费精品| 国产精品国语对白| 国产精品劲爆视频| 亚洲免费视频网站| 国产精品视频免费在线| 福利视频第一区| 国模吧一区二区| 91成品人片a无限观看| 国产精品专区h在线观看| 国产欧美va欧美va香蕉在| 成人免费网站在线看| 狠狠色狠狠色综合日日小说| 91成人国产在线观看| 国产精品亚洲一区二区三区| 久久精品视频网站| 久久久人成影片一区二区三区观看| 国产成人精品日本亚洲专区61| 日韩av影片在线观看| 久久久久久伊人| 欧美超级乱淫片喷水| 少妇久久久久久| 欧美成年人视频| 中文一区二区视频| 性色av一区二区三区在线观看| 欧美激情啊啊啊| 亚洲跨种族黑人xxx| 最近2019中文字幕在线高清| 91精品国产91久久久久久不卡| 日韩精品在线免费播放| 日韩精品免费看| 日韩电影大全免费观看2023年上| 伊人久久大香线蕉av一区二区| 国产91成人在在线播放| 国产精品视频中文字幕91| 国产精品第10页| 成人女保姆的销魂服务| 69影院欧美专区视频| 日韩欧美在线中文字幕| 欧美在线免费观看| 久久精品成人一区二区三区| 国内精品视频久久| 亚洲精品国精品久久99热| 久久伊人色综合| 欧美精品午夜视频| 一区二区三区国产在线观看| 亚洲国产美女精品久久久久∴| 日韩激情av在线免费观看| 欧美丝袜一区二区| 欧美肥老妇视频| 亚洲日韩欧美视频| 夜夜嗨av一区二区三区免费区| 成人免费在线视频网站| 国产欧美精品va在线观看| 国产精品网站视频| 日本亚洲欧美三级| 久久久久久噜噜噜久久久精品| 久久精品国产96久久久香蕉| 大胆人体色综合| 久久久欧美一区二区| 国产精品久久av| 久久这里只有精品视频首页| 欧美激情中文字幕乱码免费| 欧美国产欧美亚洲国产日韩mv天天看完整| 97免费在线视频| 国产精品成人va在线观看| 97福利一区二区| 亚洲精品电影网站| 亚洲精品小视频| 久久精品免费播放| 深夜福利日韩在线看| 日韩最新av在线| 国产精品综合久久久| 欧美第一淫aaasss性| 国产一区二区色| 久久久免费观看视频| 亚洲伊人久久大香线蕉av| 亚洲一区www| 亚洲国产精品高清久久久| 国产成人极品视频| 欧美中文字幕在线观看| 最近免费中文字幕视频2019| 91国在线精品国内播放| 午夜精品三级视频福利| 日韩欧美在线第一页| 国产一区二区免费| 久久这里只有精品视频首页| 国产精品吹潮在线观看| 亚洲成年人影院在线| 亚洲人成在线观看网站高清| 97视频在线观看成人| 国产精品亚洲网站| 国产91在线播放| 欧美成人精品一区| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产一区二区三区在线观看| 91精品久久久久久久久青青| 成人在线一区二区| 久久精品人人做人人爽|