国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP設計模式之模板方法模式定義與用法詳解

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

2019-10-14 13:24雪山飛豬 PHP教程

這篇文章主要介紹了PHP設計模式之模板方法模式,結合實例形式詳細分析了php設計模式中模板方法模式的概念、原理、定義、用法及相關注意事項,需要的朋友可以參考下

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

什么是模板方法模式

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

什么時候使用模板方法

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

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

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

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

示例

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

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

抽象類

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

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

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>標題: </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, 但是它調用了display模板方法, 這是從父類繼承的具體操作, 父類通過display()調用子類的操作.

運行后輸出

圖像路徑為:picture/chenqionghe.png
標題: chenqionghe is a handsome boy

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

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

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

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

示例

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

實現鉤子

一旦抽象類中建立了這些抽象方法, 并指定了它們執行的順序, 子類將實現所有這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都是標準方法, 只有一個實現., 不過, addShippingHook的實現有所不同, 其中有一個條件來確定是否增加運費. 這就是鉤子.

客戶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塊錢的商品最后的費用,運行結果如下

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久99精品久久久久久噜噜 | 我要看日本黄色小视频 | 久久成人国产精品 | 国产在线一二三区 | 久久99精品久久久久久园产越南 | 国产露脸系列magnet | 国产精品2 | 亚洲男人av | 蜜臀久久精品99国产精品日本 | 欧美精品一区二区三区蜜桃视频 | 日本在线视频一区二区三区 | 欧美精品乱码久久久久久按摩 | 精品国产一区二区三区av性色 | 在线观看黄免费 | 亚洲男人的天堂视频 | 国产在线91 | 久久夜夜 | 黄色日本视频 | 成人国产在线视频 | 精品在线一区二区 | 久久国产一区二区 | 免费成人黄色网址 | 色欧美亚洲 | 黄色日本视频 | 国产韩国精品一区二区三区 | 日韩欧美亚洲精品 | 亚洲成人一区二区三区在线观看 | 亚洲精品一区二区三区在线 | 大桥未久亚洲精品久久久强制中出 | 精品久久久久久亚洲综合网 | 亚洲国产精品久久久 | 久久av资源网| 亚洲www啪成人一区二区 | 97精品超碰一区二区三区 | 91成人小视频 | 亚洲精品视频在线观看网站 | 国产成人一区二区三区在线观看 | 欧美视频第一页 | 成人精品久久久 | 国产人妖一区 | 韩国成人精品a∨在线观看 欧美精品综合 |