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

主頁(yè) > 知識(shí)庫(kù) > PHP設(shè)計(jì)模式之裝飾器模式定義與用法詳解

PHP設(shè)計(jì)模式之裝飾器模式定義與用法詳解

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

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

什么是裝飾器模式

作為一種結(jié)構(gòu)型模式, 裝飾器(Decorator)模式就是對(duì)一個(gè)已有結(jié)構(gòu)增加"裝飾".

適配器模式, 是為現(xiàn)在有結(jié)構(gòu)增加的是一個(gè)適配器類,.將一個(gè)類的接口,轉(zhuǎn)換成客戶期望的另外一個(gè)接口.適配器讓原本接口不兼容的類可以很好的合作.

裝飾器模式是將一個(gè)對(duì)象包裝起來(lái)以增強(qiáng)新的行為和責(zé)任.裝飾器也稱為包裝器(類似于適配器)

有些設(shè)計(jì)設(shè)計(jì)模式包含一個(gè)抽象類,而且該抽象類還繼承了另一個(gè)抽象類,這種設(shè)計(jì)模式為數(shù)不多,而裝飾器就是其中之一.

什么時(shí)候使用裝飾器模式

基本說(shuō)來(lái), 如果想為現(xiàn)有對(duì)象增加新功能而不想影響其他對(duì)象, 就可以使用裝飾器模式.如果你好不容易為客戶創(chuàng)建了一個(gè)網(wǎng)站格式, 主要組件的工作都很完美, 客戶請(qǐng)求新功能時(shí), 你肯定不希望推翻重來(lái), 再重新創(chuàng)建網(wǎng)站. 例如, 假設(shè)你已經(jīng)構(gòu)建了客戶原先請(qǐng)求的組件, 之后客戶又有了新的需求, 希望在網(wǎng)站中包含視頻功能. 你不用重寫原先的組件, 只需要"裝飾"現(xiàn)有組件, 為它們?cè)黾右曨l功能. 這樣即可以保持原來(lái)的功能,還可以增加新功能.

有些項(xiàng)目可能有時(shí)需要裝飾, 而有時(shí)不希望裝飾, 這些項(xiàng)目體現(xiàn)了裝飾器設(shè)計(jì)模式的另一個(gè)重要特性.假設(shè)你的基本網(wǎng)站開(kāi)發(fā)模式可以滿足大多數(shù)客戶的要求. 不過(guò), 胡些客戶還希望有一些特定的功能來(lái)滿足他們的需求. 并不是所有人都希望或需要這些額外的功能. 作為開(kāi)發(fā)人員, 你希望你創(chuàng)建的網(wǎng)站能滿足客戶的業(yè)務(wù)目標(biāo). 所以需要提供"本地化"(customerization)特性, 即針對(duì)特定業(yè)務(wù)提供的特性. 利用裝飾器模式, 不僅能提供核心功能, 還可以用客戶要求的特有功能"裝飾"這些核心功能.

簡(jiǎn)單的裝飾器例子

一個(gè)web開(kāi)發(fā)企業(yè),計(jì)劃建立一個(gè)基本網(wǎng)站,并提供一些增強(qiáng)功能. 不過(guò),web開(kāi)發(fā)人員知道, 盡管這個(gè)基本計(jì)劃適用于大多數(shù)客戶, 但客戶以后很可能還希望進(jìn)一步提升, 利用裝飾器模式, 可以很容易地增加多個(gè)具體裝飾器,另外由于你能選擇要增加的裝飾器, 所以企業(yè)不僅能控制功能, 還可以控制項(xiàng)目的成本 .

Component接口

Component參與者是一個(gè)接口, 在這里, 它是一個(gè)抽象類IComponent. 這個(gè)抽象類只有一個(gè)屬性$site, 另外有兩個(gè)抽象方法getSite()getPrice().Component參與者具體為具體組件和Decorator參與者抽象類建立接口:

IComponent.php

?php
abstract class IComponent
{
  protected $site;
  abstract public function getSite();
  abstract public function getPrice();
}

Decorator接口

這個(gè)例子中的裝飾器接口可能會(huì)讓你驚訝.這是一個(gè)抽象類,而且它還擴(kuò)展了另一個(gè)抽象類! 這個(gè)類的作用就是維護(hù)組件接口(IComponent)的一個(gè)引用, 這是通過(guò)擴(kuò)展IComponent完成的:

Decorator.php

?php
abstract class Decorator extends IComponent
{
  /*
  任務(wù)是維護(hù)Component的引用
  繼承g(shù)etSite()和getPrice()
  因?yàn)槿匀皇浅橄箢?所以不需要實(shí)現(xiàn)父類任何一個(gè)抽象方法
  */
}

Decorator類的主要作用就是維護(hù)組件接口的一個(gè)引用.

在所有的裝飾器模式實(shí)現(xiàn)中, 你會(huì)發(fā)現(xiàn),具體組件和裝飾順都有相同的接口. 它們的實(shí)現(xiàn)可能不同, 另外除了基本接口的屬性和方法外, 組件和裝飾器可能還有額外的屬性和方法.

具體組件

這個(gè)例子中只有一個(gè)具體組件,它生成一個(gè)網(wǎng)站名, 另外生成一個(gè)基本網(wǎng)站報(bào)價(jià):

BasicSite.php

?php
class BasicSite extends IComponent
{
  public function __construct()
  {
    $this->site = "Basic Site";
  }
  public function getSite()
  {
    return $this->site;
  }
  public function getPrice()
  {
    return 1200;
  }
}

兩個(gè)抽象方法都使用直接賦值來(lái)實(shí)現(xiàn), 不過(guò)靈活性并不體現(xiàn)在如何改變?cè)O(shè)置的值.實(shí)際上, 要通過(guò)增加裝飾器值來(lái)改變"Basic Site"值.

具體裝飾器

這個(gè)例子中的具體裝飾器與具體組件有相同的接口.實(shí)際上, 它們是從Decorator抽象類(而不是IComponent類)繼承了這個(gè)接口. 不過(guò),要記住, Decorator所做的就是繼承IComponent接口.

Maintenance.php

?php
class Maintenance extends Decorator
{
  public function __construct(IComponent $siteNow)
  {
    $this->site = $siteNow;
  }
  public function getSite()
  {
    $format = "br /> Maintenance";
    return $this->site->getSite() . $format;
  }
  public function getPrice()
  {
    return 950 + $this->site->getPrice();
  }
}

這個(gè)裝飾器Maintenance在改變了site的值, 還有包裝的具體組件價(jià)格上還會(huì)增加它自己 的價(jià)格. 另個(gè)兩個(gè)具體裝飾器與Maintenance裝飾器也類似

Video.php

?php
class Video extends Decorator
{
  public function __construct(IComponent $siteNow)
  {
    $this->site = $siteNow;
  }
  public function getSite()
  {
    $format = "br /> Video";
    return $this->site->getSite() . $format;
  }
  public function getPrice()
  {
    return 350 + $this->site->getPrice();
  }
}

DataBase.php

?php
class DataBase extends Decorator
{
  public function __construct(IComponent $siteNow)
  {
    $this->site = $siteNow;
  }
  public function getSite()
  {
    $format = "br /> DataBase";
    return $this->site->getSite() . $format;
  }
  public function getPrice()
  {
    return 800 + $this->site->getPrice();
  }
}

測(cè)試這個(gè)應(yīng)用時(shí),可以看到,在基本的價(jià)格之上還會(huì)增加各個(gè)裝飾器的價(jià)格.另外還能指定裝飾器名的格式, 增加了兩個(gè)空格,使之縮進(jìn)

裝飾器實(shí)現(xiàn)中最重要的元素之五就是構(gòu)造函數(shù), 要為構(gòu)造函數(shù)提供一個(gè)組件類型. 由于這里只有一個(gè)具體組件, 所有裝飾器的實(shí)例化都會(huì)使用這個(gè)組件. 使用多個(gè)組件時(shí), 裝飾器可以包裝應(yīng)用中的一部分或全部組件, 也可以不包裝任何組件.

客戶

Client類并不是這個(gè)設(shè)計(jì)模式的一部分, 但是正確使用Client類至關(guān)重要.每個(gè)裝飾器在實(shí)例化時(shí)"包裝"組件, 不過(guò), 首先必須創(chuàng)建一個(gè)要包裝的對(duì)象, 這里是BasicSite類實(shí)例

Client.php

?php
function __autoload($class_name)
{
  include $class_name . '.php';
}
class Client
{
  private $basicSite;
  public function __construct()
  {
    $this->basicSite = new BasicSite();
    $this->basicSite = $this->WrapComponent($this->basicSite);
    $siteShow = $this->basicSite->getSite();
    $format = "br /> strong>Total= $";
    $price = $this->basicSite->getPrice();
    echo $siteShow . $format . $price . "/strong>";
  }
  private function WrapComponent(IComponent $component)
  {
    $component = new Maintenance($component);
    $component = new Video($component);
    $component = new DataBase($component);
    return $component;
  }
}
$worker = new Client();

wrapComponent()方法檢查傳入的BasicSite實(shí)例, 以確保參數(shù)有正確的數(shù)據(jù)類型(IComponent), 然后分別實(shí)例化3個(gè)裝飾器, 對(duì)該實(shí)例對(duì)象進(jìn)行裝飾.

Basic Site
  Maintenance
  Video
  DataBase
  Total= $3300

適配器和裝飾器模式都有另外一個(gè)名字"包裝器"(wrapper)".

適配器可以"包裝"一個(gè)對(duì)象, 創(chuàng)建一個(gè)與Adaptee兼容的接口, 而無(wú)須對(duì)它做任何修改.

裝飾器也可以"包裝"一個(gè)組件對(duì)象, 這樣就能為這個(gè)已胡的組件增加職責(zé), 而無(wú)須對(duì)它做任何修改.

下面的代碼展示了Client如何將組件對(duì)象($component)包裝在裝飾器(Maintence)中:

$component = new Maintenance($component);

類似于"接口", 在計(jì)算機(jī)編程中用到"包裝器"時(shí), 不同的上下文會(huì)有不同的用法和含義. 一般來(lái)講, 在設(shè)計(jì)模式中使用"包裝器"是為了處理接口的不兼容, 或者希望為組件增加功能,包裝器就表示用來(lái)減少不兼容性的策略.

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

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

您可能感興趣的文章:
  • 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)裝飾器模式(decorator)
  • PHP簡(jiǎn)單裝飾器模式實(shí)現(xiàn)與用法示例
  • PHP設(shè)計(jì)模式之裝飾器模式實(shí)例詳解
  • PHP設(shè)計(jì)模式之裝飾器模式定義與用法簡(jiǎn)單示例
  • PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(六)橋連模式Bridge實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(五)適配器模式Adapter實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式(三)建造者模式Builder實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式概論【概念、分類、原則等】
  • PHP設(shè)計(jì)模式(八)裝飾器模式Decorator實(shí)例詳解【結(jié)構(gòu)型】

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式之裝飾器模式定義與用法詳解》,本文關(guān)鍵詞  PHP,設(shè)計(jì)模式,之,裝飾,器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計(jì)模式之裝飾器模式定義與用法詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP設(shè)計(jì)模式之裝飾器模式定義與用法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 爱情一级毛片毛多水多| 国产日韩欧美一区二区三区综合| 色啪啪97一区二区三区| 色情乱婬一区二区三区在线播放 | 看污网址| 精品无码午夜福利理论片在线观看| 综影视穿肉h辣np文| 久久免费久久| 狠狠躁天天躁夜夜躁夜天战| 欧美视频精品全部免费观看| 一级特黄aa大片免费播放视频| 亚洲天堂视频在线观看| 欧美在线二区| 月火焚心类的古文| 国产牛仔裤紧身裤一区| 天天摸天天碰中文字幕| www.男人天堂| 国产精品va在线观看手机版| 成人无码一级毛片VV96CC| 亚洲精品线路一在线观看| 中文字幕亚洲| 国产女人高潮毛片| 公与妇乱理三级| 性开放网交友网站在线| 宫女趴春凳脱裙子打屁股| 无码精品人妻一区二区三区红楼 | s货叫大点声C烂你的SB| 阿娇与冠希13分49秒视频| 男男调教视频| 美妇h| 欧美精品中文字幕在线| yy6080私人啪啪| 456亚洲人成在线播放网站| 激情五月激情综合色区| 再深点灬舒服灬再浪一点| 色哟哟?国产seyoyo| 波罗野结衣被躁57分钟| 能看的黄色小说| 老师我好爽再深一点h| 出差和公我和公乱小说| 国产AV精品秘?软件下载|