結(jié)構(gòu)型模式-裝飾器模式

  1. 定義

在不改變原有對象的基礎(chǔ)上,動態(tài)的給對象增加新的功能橙凳。提供了比繼承更加彈性的方案。

  1. 通用類圖


    Decorator.png
  2. 我對裝飾器模式的理解
  • 組件

裝飾器模式中包括抽象組件(Component)锯玛、抽象裝飾者(Decorator)踏烙、具體組件(ConcreteComponent)、具體裝飾者(ConcreteDecorator)四種組件黔龟。

  • 思想
  1. 定義一個頂層的抽象組件妇智,在抽象組件中定義一個組件中的屬性和方法。
  2. 讓裝飾器和具體的組件都去繼承這個抽象組件,使它們在同一繼承體系下氏身。在抽象裝飾器的構(gòu)造方法中傳入一個組件巍棱,從而可以獲取被裝飾的組件的實例。重寫抽象組件中定義的方法蛋欣。
  3. 實現(xiàn)具體的裝飾器航徙,重寫抽象組件中的方法,可以在具體邏輯處理之前或者之后增加功能陷虎。
  1. 一次擴展實現(xiàn)
    背景:現(xiàn)有一個煎餅果子類到踏,只有基礎(chǔ)的煎餅果子該有的東西杠袱,并且已經(jīng)上線。現(xiàn)在想在不修改這個類的前提下進行功能擴展窝稿,比如加雞蛋楣富,加香腸。
/**
 * 現(xiàn)有的煎餅果子類伴榔,不能添加任何功能纹蝴,只有名稱和基礎(chǔ)價格
 */
public class BaseBattercake{


    public String getMsg() {
        return "煎餅果子";
    }


    public int getPrice() {
        return 5;
    }
}

設(shè)計思路:

  1. 定義一個抽象裝飾器,繼承該類踪少。
  2. 定義具體的裝飾塘安,雞蛋裝飾和香腸裝飾。
//抽象裝飾器
public abstract class BattercakeDecorator extends BaseBattercake {
    private BaseBattercake battercake;

    public BattercakeDecorator(BaseBattercake battercake) {
        this.battercake = battercake;
    }

    @Override
    public String getMsg() {
        return this.battercake.getMsg();
    }

    @Override
    public int getPrice() {
        return this.battercake.getPrice();
    }
}
//雞蛋裝飾器
public class EggDecorator extends BattercakeDecorator {

    public EggDecorator(BaseBattercake battercake) {
        super(battercake);
    }

    @Override
    public String getMsg() {
        return super.getMsg() + "+ 一個雞蛋";
    }

    @Override
    public int getPrice() {
        return super.getPrice() + 1;
    }
}
//香腸裝飾器
public class SausageDecorator extends BattercakeDecorator {
    public SausageDecorator(BaseBattercake battercake) {
        super(battercake);
    }

    @Override
    public String getMsg() {
        return super.getMsg() + "+ 一個香腸";
    }

    @Override
    public int getPrice() {
        return super.getPrice() + 2;
    }
}

public class Test {

    public static void main(String[] args) {

        BaseBattercake battercake = new BaseBattercake();

        System.out.println(battercake.getMsg() + battercake.getPrice());


        BattercakeDecorator decorator = new EggDecorator(battercake);
        decorator = new EggDecorator(decorator);

        decorator = new SausageDecorator(decorator);
        System.out.println(decorator.getMsg() +",¥"+ decorator.getPrice());


    }
}
  1. 優(yōu)缺點
    優(yōu)點:
  • 裝飾器模式是繼承的有力補充援奢,比繼承更加靈活兼犯,在不改變原有功能的基礎(chǔ)上,進行功能的擴展萝究。
  • 可以使用不同的裝飾類進行擴展免都,從而達到不同的效果。
  • 使用裝飾器完全符合開閉原則帆竹。

缺點:

  • 會出現(xiàn)更多的代碼和更多的類绕娘,增加系統(tǒng)的復(fù)雜度。
  • 動態(tài)裝飾時栽连,多層裝飾更復(fù)雜险领。
  1. 與代理模式的對比
    擴展面不同。裝飾器模式強調(diào)的是concreteComponent功能的擴展秒紧,主體對象是concreteComponent绢陌,著重類功能的變化。代理模式強調(diào)對代理過程的控制熔恢,Proxy完全掌握對RealSubject的控制脐湾,主體對象是Proxy。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叙淌,一起剝皮案震驚了整個濱河市秤掌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹰霍,老刑警劉巖闻鉴,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茂洒,居然都是意外死亡孟岛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渠羞,“玉大人斤贰,你說我怎么就攤上這事〈窝” “怎么了腋舌?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渗蟹。 經(jīng)常有香客問我,道長赞辩,這世上最難降的妖魔是什么雌芽? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辨嗽,結(jié)果婚禮上世落,老公的妹妹穿的比我還像新娘。我一直安慰自己糟需,他們只是感情好屉佳,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洲押,像睡著了一般武花。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杈帐,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天体箕,我揣著相機與錄音,去河邊找鬼挑童。 笑死累铅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的站叼。 我是一名探鬼主播娃兽,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尽楔!你這毒婦竟也來了投储?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翔试,失蹤者是張志新(化名)和其女友劉穎轻要,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垦缅,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡冲泥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡恍。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡志秃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚼酝,到底是詐尸還是另有隱情浮还,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布闽巩,位于F島的核電站钧舌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涎跨。R本人自食惡果不足惜洼冻,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隅很。 院中可真熱鬧撞牢,春花似錦、人聲如沸叔营。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绒尊。三九已至畜挥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婴谱,已是汗流浹背砰嘁。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勘究,地道東北人矮湘。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像口糕,于是被迫代替她去往敵國和親缅阳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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