好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > PHP設(shè)計模式之模板方法模式定義與用法詳解

PHP設(shè)計模式之模板方法模式定義與用法詳解

熱門標(biāo)簽:遼寧ai電銷機(jī)器人價格 寧波外呼營銷系統(tǒng) 福建銀行智能外呼系統(tǒng)價格 房產(chǎn)中介用的是什么外呼系統(tǒng) 上海做外呼線路的通信公司 長沙做地圖標(biāo)注公司 四川保險智能外呼系統(tǒng)供應(yīng)商 地圖標(biāo)注專員怎么樣 電話機(jī)器人銷售主要負(fù)責(zé)什么

本文實(shí)例講述了PHP設(shè)計模式之模板方法模式定義與用法。分享給大家供大家參考,具體如下:

什么是模板方法模式

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

什么時候使用模板方法

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

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

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

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

示例

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

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

抽象類

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

兩個抽象方法分別是addPicture和addTitile,這兩個操作都包含一個參數(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模板方法, 這是從父類繼承的具體操作, 父類通過display()調(diào)用子類的操作.

運(yùn)行后輸出

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

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

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

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

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

示例

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

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

一旦抽象類中建立了這些抽象方法, 并指定了它們執(zhí)行的順序, 子類將實(shí)現(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都是標(biāo)準(zhǔn)方法, 只有一個實(shí)現(xiàn)., 不過, addShippingHook的實(shí)現(xiàn)有所不同, 其中有一個條件來確定是否增加運(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演示了分別購買100塊錢和200塊錢的商品最后的費(fèi)用,運(yùn)行結(jié)果如下

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP基本語法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設(shè)計有所幫助。

您可能感興趣的文章:
  • 學(xué)習(xí)php設(shè)計模式 php實(shí)現(xiàn)模板方法模式
  • PHP設(shè)計模式之模板模式定義與用法詳解
  • PHP設(shè)計模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
  • php設(shè)計模式 Template (模板模式)
  • php設(shè)計模式 DAO(數(shù)據(jù)訪問對象模式)
  • php設(shè)計模式 Proxy (代理模式)
  • php單態(tài)設(shè)計模式(單例模式)實(shí)例
  • php設(shè)計模式 Singleton(單例模式)
  • php設(shè)計模式 Facade(外觀模式)
  • php設(shè)計模式 Strategy(策略模式)
  • PHP設(shè)計模式之模板方法模式實(shí)例淺析

標(biāo)簽:工商登記 常德 深圳 澳門 宿遷 佛山 延安 宜春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計模式之模板方法模式定義與用法詳解》,本文關(guān)鍵詞  PHP,設(shè)計模式,之,模板,方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計模式之模板方法模式定義與用法詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP設(shè)計模式之模板方法模式定義與用法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 操美女下面| 男人狂揉摸下面女人视频| 都市艳妇激情短篇小说| 曰本人做爰大片免费观看| 又白又大的两座峰| 《诱人的护士》在线观看| 1313国产精品伦理| 亲胸揉胸膜下刺激娇午夜视频| 极品白嫩无套视频在线播放张悠雨 | 全肉乱妇淑芬| 真实精品酒店偷拍拍在线| 免费无码又爽又刺激A片涩涩B站| 夜夜爽夜夜爱| 是我撞进去还是你自己来| 差差漫画免费漫画页面看健身教练| 亚洲综合网美国十次| 六月婷婷七月丁香| 国产日韩在线观看视频网站| yy漫画在线看| 国外留学和5个老外做| 国产成人无码片在线观看| 热辣文| 国产?精品?无码?怀| 国产精品m3u8视频| 男男多肉文| 欧洲另类一二三四区| 三上悠亚在线免费| 喷潮女王Cytherea和黑人| maya十八岁禁止| 全黄H全肉强迫调教sm| 久99久精品免费视频热77| 日韩在线免费电影| 国产?少萝??视频| 97久久超碰国产精品电影| 69成年网| 日韩在线视频网| narutoandhinata玖辛奈足控 | 免费无码毛片一区二区A片小说| 日韩砖矿专区2020| 亚洲综合精品| 又粗又硬又爽的三级视频|