PHP設(shè)計(jì)模式-裝飾者模式

  • 不使用繼承
  • 動(dòng)態(tài)擴(kuò)展
  • 不改變?cè)械念?/li>

裝飾器模式是一種結(jié)構(gòu)型模式,它動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來(lái)說(shuō)蔬胯,Decorator模式相比生成子類更為靈活。

裝飾模式是以對(duì)客戶透明的方式動(dòng)態(tài)地給一個(gè)對(duì)象附加上更多的職責(zé)位他。這也就是說(shuō)氛濒,客戶端并不會(huì)覺(jué)得對(duì)象在裝飾前和裝飾后有什么不同。裝飾模式可以在不使用創(chuàng)造更多子類的情況下鹅髓,將對(duì)象的功能加以擴(kuò)展舞竿。

主要角色

  • 抽象構(gòu)件(Component)角色:定義一個(gè)對(duì)象接口,以規(guī)范準(zhǔn)備接收附加職責(zé)的對(duì)象窿冯,從而可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé)骗奖。
  • 具體構(gòu)件(Concrete Component)角色:定義一個(gè)將要接收附加職責(zé)的類。
  • 裝飾(Decorator)角色:持有一個(gè)指向Component對(duì)象的指針,并定義一個(gè)與Component接口一致的接口执桌。
  • 具體裝飾(Concrete Decorator)角色:負(fù)責(zé)給構(gòu)件對(duì)象增加附加的職責(zé)鄙皇。

適用性

  • 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)仰挣、透明的方式給單個(gè)對(duì)象添加職責(zé)伴逸。
  • 處理那些可以撤消的職責(zé),即需要?jiǎng)討B(tài)的給一個(gè)對(duì)象添加功能并且這些功能是可以動(dòng)態(tài)的撤消的膘壶。
  • 當(dāng)不能彩生成子類的方法進(jìn)行擴(kuò)充時(shí)错蝴。一種情況是,可能有大量獨(dú)立的擴(kuò)展颓芭,為支持每一種組合將產(chǎn)生大量的子類顷锰,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏亡问,或類定義不能用于生成子類馍惹。
  1. 原始類接口 Component
  2. 原始類接口的具體實(shí)現(xiàn)類 Concrete Component
  3. 裝飾器接口 Decorator
  4. 裝飾器接口的具體實(shí)現(xiàn) Concrete Decorator

示例2

//基類
abstract class Beverage()
{
    private $description = 'Unknown Beverage';

    public function getDescription()
    {
        return $description;
    }

    abstract public function double cost();
}

//實(shí)例1
class Espresso extends Beverage
{
    public function __construction()
    {
        $this->description = "Espresso";
    }

    public function cost()
    {
        return 1.99;
    }
}

//實(shí)例2
class HouseBlend extends Beverage
{
    public function __construction()
    {
        $this->description = "HouseBlend";
    }

    public function cost()
    {
        return 0.89;
    }
}

//裝飾者接口
abstract class CondimentDecorator extends Beverage
{
    protected $beverage;

    public function __construct(Beverage $beverage)
    {
        $this->beverage = $beverage;
    }

    abstract public function getDescription();
}

//裝飾者1
class Mocha extends CondimentDecorator
{
    public function getDescription()
    {
        return $this->beverage->getDescription.", Mocha";
    }

    public function cost()
    {
        return .20 + $this->beverage->cost();
    }
}

測(cè)試

$expressoWithMocha = new Mocha(new Espresso());
$expressoWithMocha->getDescription();
$expressoWithMocha->cost();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玛界,隨后出現(xiàn)的幾起案子陨仅,更是在濱河造成了極大的恐慌立轧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虫啥,居然都是意外死亡物臂,警方通過(guò)查閱死者的電腦和手機(jī)瘟滨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門锯蛀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人馅精,你說(shuō)我怎么就攤上這事严嗜。” “怎么了洲敢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵漫玄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我压彭,道長(zhǎng)睦优,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任壮不,我火速辦了婚禮汗盘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘询一。我一直安慰自己隐孽,他們只是感情好癌椿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著菱阵,像睡著了一般踢俄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送粱,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音掂之,去河邊找鬼抗俄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛世舰,可吹牛的內(nèi)容都是我干的动雹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跟压,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胰蝠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起震蒋,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茸塞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后查剖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钾虐,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年笋庄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了效扫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡直砂,死狀恐怖菌仁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情静暂,我是刑警寧澤济丘,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站洽蛀,受9級(jí)特大地震影響闪盔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辱士,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一泪掀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颂碘,春花似錦异赫、人聲如沸椅挣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼠证。三九已至,卻和暖如春靠抑,著一層夾襖步出監(jiān)牢的瞬間量九,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工颂碧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠列,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓载城,卻偏偏與公主長(zhǎng)得像肌似,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诉瓦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 復(fù)雜的獎(jiǎng)金計(jì)算## 考慮這樣一個(gè)實(shí)際應(yīng)用:就是如何實(shí)現(xiàn)靈活的獎(jiǎng)金計(jì)算川队。 獎(jiǎng)金計(jì)算是相對(duì)復(fù)雜...
    七寸知架構(gòu)閱讀 4,007評(píng)論 4 67
  • 0x01 前言 ??裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變...
    菩提樹(shù)下成魔閱讀 410評(píng)論 0 0
  • 設(shè)計(jì)模式匯總 一睬澡、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用固额、多...
    MinoyJet閱讀 3,948評(píng)論 1 15
  • 本篇文章介紹一種設(shè)計(jì)模式——裝飾者模式。裝飾者模式在Java中的典型應(yīng)用就是IO流煞聪,在本篇文章中將有詳細(xì)介紹对雪。本篇...
    Ruheng閱讀 22,213評(píng)論 13 56
  • 設(shè)計(jì)原則: 少用繼承,多用組合 類應(yīng)該對(duì)擴(kuò)展開(kāi)放米绕,對(duì)修改關(guān)閉 目錄 本文的結(jié)構(gòu)如下: 什么是裝飾者模式 為什么要用...
    w1992wishes閱讀 1,182評(píng)論 0 7