欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年04月02日 10:07:54   作者:雪山飛豬  
這篇文章主要介紹了PHP設(shè)計模式之模板方法模式,結(jié)合實例形式詳細(xì)分析了php設(shè)計模式中模板方法模式的概念、原理、定義、用法及相關(guān)注意事項,需要的朋友可以參考下

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

什么是模板方法模式

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

什么時候使用模板方法

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

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

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

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

示例

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

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

抽象類

抽象類是這里的關(guān)鍵, 因為它同時包含具體和抽象方法. 模板方法往往是具體方法, 其操作是抽象的

兩個抽象方法分別是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變量實例化了Concrete, 但是它調(diào)用了display模板方法, 這是從父類繼承的具體操作, 父類通過display()調(diào)用子類的操作.

運行后輸出

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

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

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

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

在模板方法設(shè)計模式中, 利用鉤子可以將一個方法作為模板的一部分,不過不一定會用到這個方法, 換句話說, 它是方法的一部分,不過它包含一個鉤子, 可以處理例外情況. 子類可以為算法增加一個可選元素, 這樣一來, 盡管仍按模板方法建立的順序執(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都是標(biāo)準(zhǔn)方法, 只有一個實現(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塊錢的商品最后的費用,運行結(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è)計有所幫助。

相關(guān)文章

  • PHP整合PayPal支付

    PHP整合PayPal支付

    PayPal作為全球運用最廣的在線支付工具,一直被很多外貿(mào)B2C網(wǎng)站納為首選支付工具。不過對于自主開發(fā)網(wǎng)站的商戶來說,PayPal接口的集成經(jīng)常遇到很多問題,今天Lance就在這里給大家分享一下php項目中PayPal接口的集成方法。
    2015-06-06
  • php xml分析函數(shù)代碼

    php xml分析函數(shù)代碼

    我最喜愛的腳本語言不但支持XML而且對其支持正不斷加強。PHP可以讓我迅速將XML文檔發(fā)布到互聯(lián)網(wǎng)上,收集XML文檔的統(tǒng)計信息,將XML文檔轉(zhuǎn)換成其它格式。
    2008-08-08
  • PHP操作文件方法問答

    PHP操作文件方法問答

    PHP操作文件方法問答...
    2007-03-03
  • paypal即時到賬php實現(xiàn)代碼

    paypal即時到賬php實現(xiàn)代碼

    paypal即時到賬php實現(xiàn)代碼,需要的朋友可以參考下。
    2010-11-11
  • PHP使用mpdf實現(xiàn)導(dǎo)出pdf文件功能

    PHP使用mpdf實現(xiàn)導(dǎo)出pdf文件功能

    這篇文章主要為大家詳細(xì)介紹了PHP如何使用mpdf實現(xiàn)導(dǎo)出pdf文件功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • PHP實現(xiàn)十進(jìn)制數(shù)字與二十六進(jìn)制字母串相互轉(zhuǎn)換操作示例

    PHP實現(xiàn)十進(jìn)制數(shù)字與二十六進(jìn)制字母串相互轉(zhuǎn)換操作示例

    這篇文章主要介紹了PHP實現(xiàn)十進(jìn)制數(shù)字與二十六進(jìn)制字母串相互轉(zhuǎn)換操作,涉及php字符串遍歷、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • PHP實現(xiàn)將標(biāo)點符號正則替換為空格的方法

    PHP實現(xiàn)將標(biāo)點符號正則替換為空格的方法

    這篇文章主要介紹了PHP實現(xiàn)將標(biāo)點符號正則替換為空格的方法,結(jié)合實例形式分析了php針對符號的正則匹配相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • php自定義截取中文字符串-utf8版

    php自定義截取中文字符串-utf8版

    本文主要介紹了php自定義截取中文字符串的方法,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • PHP的5個安全措施小結(jié)

    PHP的5個安全措施小結(jié)

    多年來,PHP一直是一個穩(wěn)定的、廉價的運行基于web應(yīng)用程序的平臺。像大多數(shù)基于web的平臺一樣,PHP也是容易受到外部攻擊的
    2012-07-07
  • PHP URL地址獲取函數(shù)代碼(端口等) 推薦

    PHP URL地址獲取函數(shù)代碼(端口等) 推薦

    PHP URL地址獲取函數(shù)代碼(端口等) ,看了這段代碼,基本上其它的不用看了,直接拿來使用即可。
    2010-05-05

最新評論