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

首頁 > 語言 > PHP > 正文

PHP設計模式之裝飾器模式定義與用法詳解

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

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

什么是裝飾器模式

作為一種結構型模式, 裝飾器(Decorator)模式就是對一個已有結構增加"裝飾".

適配器模式, 是為現在有結構增加的是一個適配器類,.將一個類的接口,轉換成客戶期望的另外一個接口.適配器讓原本接口不兼容的類可以很好的合作.

裝飾器模式是將一個對象包裝起來以增強新的行為和責任.裝飾器也稱為包裝器(類似于適配器)

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

什么時候使用裝飾器模式

基本說來, 如果想為現有對象增加新功能而不想影響其他對象, 就可以使用裝飾器模式.如果你好不容易為客戶創建了一個網站格式, 主要組件的工作都很完美, 客戶請求新功能時, 你肯定不希望推翻重來, 再重新創建網站. 例如, 假設你已經構建了客戶原先請求的組件, 之后客戶又有了新的需求, 希望在網站中包含視頻功能. 你不用重寫原先的組件, 只需要"裝飾"現有組件, 為它們增加視頻功能. 這樣即可以保持原來的功能,還可以增加新功能.

有些項目可能有時需要裝飾, 而有時不希望裝飾, 這些項目體現了裝飾器設計模式的另一個重要特性.假設你的基本網站開發模式可以滿足大多數客戶的要求. 不過, 胡些客戶還希望有一些特定的功能來滿足他們的需求. 并不是所有人都希望或需要這些額外的功能. 作為開發人員, 你希望你創建的網站能滿足客戶的業務目標. 所以需要提供"本地化"(customerization)特性, 即針對特定業務提供的特性. 利用裝飾器模式, 不僅能提供核心功能, 還可以用客戶要求的特有功能"裝飾"這些核心功能.

簡單的裝飾器例子

一個web開發企業,計劃建立一個基本網站,并提供一些增強功能. 不過,web開發人員知道, 盡管這個基本計劃適用于大多數客戶, 但客戶以后很可能還希望進一步提升, 利用裝飾器模式, 可以很容易地增加多個具體裝飾器,另外由于你能選擇要增加的裝飾器, 所以企業不僅能控制功能, 還可以控制項目的成本 .

Component接口

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

IComponent.php

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

Decorator接口

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

Decorator.php

<?phpabstract class Decorator extends IComponent{  /*  任務是維護Component的引用  繼承getSite()和getPrice()  因為仍然是抽象類,所以不需要實現父類任何一個抽象方法  */}

Decorator類的主要作用就是維護組件接口的一個引用.

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

具體組件

這個例子中只有一個具體組件,它生成一個網站名, 另外生成一個基本網站報價:

BasicSite.php

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

兩個抽象方法都使用直接賦值來實現, 不過靈活性并不體現在如何改變設置的值.實際上, 要通過增加裝飾器值來改變"Basic Site"值.

具體裝飾器

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

Maintenance.php

<?phpclass 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();  }}

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

Video.php

<?phpclass 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

<?phpclass 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();  }}

測試這個應用時,可以看到,在基本的價格之上還會增加各個裝飾器的價格.另外還能指定裝飾器名的格式, 增加了兩個空格,使之縮進

裝飾器實現中最重要的元素之五就是構造函數, 要為構造函數提供一個組件類型. 由于這里只有一個具體組件, 所有裝飾器的實例化都會使用這個組件. 使用多個組件時, 裝飾器可以包裝應用中的一部分或全部組件, 也可以不包裝任何組件.

客戶

Client類并不是這個設計模式的一部分, 但是正確使用Client類至關重要.每個裝飾器在實例化時"包裝"組件, 不過, 首先必須創建一個要包裝的對象, 這里是BasicSite類實例

Client.php

<?phpfunction __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實例, 以確保參數有正確的數據類型(IComponent), 然后分別實例化3個裝飾器, 對該實例對象進行裝飾.

Basic Site
  Maintenance
  Video
  DataBase
  Total= $3300

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

適配器可以"包裝"一個對象, 創建一個與Adaptee兼容的接口, 而無須對它做任何修改.

裝飾器也可以"包裝"一個組件對象, 這樣就能為這個已胡的組件增加職責, 而無須對它做任何修改.

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

$component = new Maintenance($component);

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

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


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产精品99国产精| 日韩av快播网址| 国产第一区电影| 日韩欧美中文第一页| 中文字幕国产精品| 欧美激情一级欧美精品| 久久夜色精品国产欧美乱| 国产精品一区二区三区免费视频| 国产精品久久婷婷六月丁香| 日韩在线视频线视频免费网站| 国产日韩欧美日韩| 欧美电影免费观看高清| 久久久久久久国产精品视频| 国产不卡视频在线| 亚洲精品99久久久久中文字幕| 亚洲欧美激情精品一区二区| 国产成人精品久久| 日本乱人伦a精品| 色偷偷91综合久久噜噜| 成人在线视频网| 5566成人精品视频免费| 日韩激情视频在线播放| 国产剧情久久久久久| 国内精品伊人久久| 欧美天天综合色影久久精品| 91国产精品视频在线| 疯狂欧美牲乱大交777| 亚洲人成网站免费播放| 欧美日韩国产二区| 亚洲精品wwww| 97成人超碰免| 国语自产精品视频在线看一大j8| 国产成人精品av| 91久久久在线| 亚洲欧美日韩高清| 国产va免费精品高清在线| 国产欧美韩国高清| 黄色成人av在线| 国产精品偷伦免费视频观看的| 成人精品一区二区三区| 欧美高清一级大片| 国产精品夜色7777狼人| 狠狠爱在线视频一区| 久久久久久久久中文字幕| 日韩欧美在线播放| 中文字幕日韩av| 人妖精品videosex性欧美| 午夜精品一区二区三区在线播放| 欧美在线一区二区视频| 欧美午夜性色大片在线观看| 91最新在线免费观看| 欧美成人黄色小视频| 秋霞成人午夜鲁丝一区二区三区| 国产精品久久久久久av福利| 欧美午夜精品久久久久久久| 欧美成人sm免费视频| 欧美性xxxxxx| 成人观看高清在线观看免费| 欧美成人一区在线| 黑人巨大精品欧美一区二区一视频| 国产精品无码专区在线观看| 久久九九精品99国产精品| 亚洲一区亚洲二区亚洲三区| 成人免费视频xnxx.com| 欧美成人黑人xx视频免费观看| 国产区精品视频| 亚洲人精选亚洲人成在线| 色与欲影视天天看综合网| 亚洲欧美日韩国产中文专区| 久久久久久久成人| 欧美另类在线观看| 亚洲午夜性刺激影院| 日韩一区二区福利| 日韩精品高清视频| 九九久久久久久久久激情| 欧美日韩aaaa| 国产欧洲精品视频| xxxx欧美18另类的高清| 欧美黑人xxxⅹ高潮交| 2025国产精品视频| 国产伦精品一区二区三区精品视频| xxxxx91麻豆| 欧美裸身视频免费观看| 中文字幕视频一区二区在线有码| 亚洲xxx大片| 久久视频在线观看免费| 日韩电影免费在线观看| 国产精品久久久久久久久借妻| 欧美黑人巨大xxx极品| 97在线视频免费| 欧美日本高清视频| 亚洲欧美www| 欧美在线视频播放| 久久久久久一区二区三区| 成人妇女免费播放久久久| 狠狠躁夜夜躁人人爽超碰91| 欧美激情一区二区三区在线视频观看| 亚洲成人精品av| 日韩av影院在线观看| 日韩免费在线观看视频| 国产一区香蕉久久| 这里只有视频精品| 欧美激情精品久久久| 亚洲精品一区在线观看香蕉| 国产在线播放不卡| 国产精品亚洲片夜色在线| 亚洲免费视频网站| 欧美理论电影在线观看| 久久亚洲国产精品成人av秋霞| 国外成人性视频| 在线亚洲国产精品网| 中文字幕亚洲图片| 久久精品成人动漫| 日韩在线观看你懂的| 久久天天躁日日躁| 亚洲成人av在线播放| 久久国产天堂福利天堂| 一区二区日韩精品| 精品久久久久久亚洲精品| 亚洲精品免费网站| 国内精品久久久久影院 日本资源| 亚洲欧美在线一区| 色妞色视频一区二区三区四区| 粗暴蹂躏中文一区二区三区| 国自产精品手机在线观看视频| 欧美做受高潮电影o| 欧美丝袜一区二区三区| www.日韩不卡电影av| 亚洲精品国产精品乱码不99按摩| 国产精品久久久久一区二区| 久久久精品2019中文字幕神马| 久久人人爽人人爽人人片av高清| 欧美久久精品午夜青青大伊人| 深夜福利亚洲导航| 久久国产精品久久久久久久久久| 97超级碰在线看视频免费在线看| 91精品久久久久久久久久| 日韩欧美成人精品| 亚洲国产天堂久久综合| 亚洲国产高清自拍| 国产精品 欧美在线| 亚洲男女自偷自拍图片另类| 日韩成人小视频| 欧美午夜女人视频在线| 亚洲色图av在线| 欧美大片第1页| 91免费的视频在线播放| 国产亚洲欧洲在线| 国产精品久久久久影院日本| 亚洲欧美在线免费| 国产精品欧美日韩一区二区| 亚洲精品第一国产综合精品| 久久91精品国产| 亚洲理论电影网| 清纯唯美日韩制服另类| 国产精品一区二区久久久久| 亚洲性夜色噜噜噜7777| 国产在线精品成人一区二区三区| 欧美在线性爱视频| 国产精品视频免费在线观看| 精品露脸国产偷人在视频| 国产精品久在线观看| 奇米一区二区三区四区久久| 91国产美女视频|