裝飾器模式

裝飾模式

裝飾模式定義

定義:裝飾模式就是動態(tài)的得給一個對象添加一些額外的職責(zé),就增加功能來說,裝飾器模式比生成子類更為靈活;

裝飾模式結(jié)構(gòu)圖:

image-20210309163455062.png

"Component是定義一個對象接口,可以給這些對象動態(tài)的添加職責(zé);ConcreteComponent是定義了一個具體的對象,也可以給這個對象添加一些職責(zé).Decorator,裝飾抽象類,繼承了component從外類來拓展Component類的功能,但對于Component來說,是無需知道Decorator的存在.至于ConcreteDecorator就是具體的裝飾對象,起到給Component添加職責(zé)的功能"

裝飾模式是利用setComponent來對對象進行包裝的.這樣每個裝飾對象的實現(xiàn)就和如何使用這個對象分離開了,每個裝飾對象只關(guān)心自己的功能,不需要關(guān)心如何被添加到對象鏈當(dāng)中

裝飾器模式的實現(xiàn)

image-20210309164304545.png

1.新建一個ConcreteComponent人類,其中提供構(gòu)造方法和show方法

package org.example.component;

/**
 * @author 
 * @date 2021/3/9 15:20
 **/
public class Person {
    private String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }


    public void show() {
        System.out.println("裝扮的" + name);
    }
}

2.編寫裝飾抽象類并繼承于人類,實現(xiàn)其show方法,并提供Person屬性

package org.example.component;

/**
 * @author 
 * @date 2021/3/9 15:21
 **/
public class Finery extends Person {
    protected Person person;

    public void Decorate(Person person) {
        System.out.println("person");
        this.person = person;
    }

    @Override
    public void show() {
        if (person != null) {
            person.show();
        }
    }

}

3.編寫具體裝扮類

public class BigTrouser extends Finery {


    @Override
    public void show() {
        System.out.println("垮褲");
        super.show();
    }
}
public class Shoes  extends Finery{
    @Override
    public void show() {
        System.out.println("鞋子");
        super.show();
    }
}
public class Tshirts extends Finery{


    @Override
    public void show() {
        System.out.println("大T");
        super.show();
    }
}

4.客戶端調(diào)用

package org.example.component;

/**
 * @author 
 * @date 2021/3/9 15:28
 **/
public class Test3 {

    public static void main(String[] args) {

        Person test = new Person("測試");
        Tshirts tshirts = new Tshirts();
        BigTrouser bigTrouser = new BigTrouser();
        Shoes shoes = new Shoes();
        //添加到對象鏈中
        tshirts.Decorate(test);
        bigTrouser.Decorate(tshirts);
        shoes.Decorate(bigTrouser);
        shoes.show();
    }
}

5.運行結(jié)果

image-20210309164758601.png

裝飾器模式調(diào)用流程

裝飾器模式流程.png

裝飾器模式的優(yōu)缺點

優(yōu)點

  • 裝飾類和被裝飾類可以獨立發(fā)展跪削,而不會相互耦合夺巩。換句話說,Component類無需知道Decorator類舀奶,Decorator類是從外部來擴展Component類的功能瞧捌,而Decorator也不用知道具體的構(gòu)件。

  • 裝飾器模式是繼承關(guān)系的一個替代方案。我們看裝飾類Decorator页慷,不管裝飾多少層,返回的對象還是Component(因為Decorator本身就是繼承自Component的)胁附,實現(xiàn)的還是is-a的關(guān)系酒繁。

  • 裝飾模式可以動態(tài)地擴展一個實現(xiàn)類的功能,比如在I/O系統(tǒng)中控妻,我們直接給BufferedInputStream的構(gòu)造器直接傳一個InputStream就可以輕松構(gòu)件一個帶緩沖的輸入流州袒,如果需要擴展,我們繼續(xù)“裝飾”即可弓候。

    缺點

多層的裝飾是比較復(fù)雜的郎哭。為什么會復(fù)雜?你想想看菇存,就像剝洋蔥一樣夸研,你剝到最后才發(fā)現(xiàn)是最里層的裝飾出現(xiàn)了問題,可以想象一下工作量依鸥。這點從我使用Java I/O的類庫就深有感受亥至,我只需要單一結(jié)果的流,結(jié)果卻往往需要創(chuàng)建多個對象,一層套一層姐扮,對于初學(xué)者來說容易讓人迷惑絮供。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茶敏,隨后出現(xiàn)的幾起案子壤靶,更是在濱河造成了極大的恐慌,老刑警劉巖惊搏,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮乳,死亡現(xiàn)場離奇詭異,居然都是意外死亡胀屿,警方通過查閱死者的電腦和手機塘揣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宿崭,“玉大人亲铡,你說我怎么就攤上這事∑隙遥” “怎么了奖蔓?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讹堤。 經(jīng)常有香客問我吆鹤,道長,這世上最難降的妖魔是什么洲守? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任疑务,我火速辦了婚禮,結(jié)果婚禮上梗醇,老公的妹妹穿的比我還像新娘知允。我一直安慰自己,他們只是感情好叙谨,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布温鸽。 她就那樣靜靜地躺著,像睡著了一般手负。 火紅的嫁衣襯著肌膚如雪涤垫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天竟终,我揣著相機與錄音蝠猬,去河邊找鬼。 笑死统捶,一個胖子當(dāng)著我的面吹牛榆芦,可吹牛的內(nèi)容都是我干的敦姻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼歧杏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迷守?” 一聲冷哼從身側(cè)響起犬绒,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兑凿,沒想到半個月后凯力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡礼华,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年咐鹤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圣絮。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡祈惶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扮匠,到底是詐尸還是另有隱情捧请,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布棒搜,位于F島的核電站疹蛉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏力麸。R本人自食惡果不足惜可款,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望克蚂。 院中可真熱鬧闺鲸,春花似錦、人聲如沸陨舱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽游盲。三九已至误墓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間益缎,已是汗流浹背谜慌。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莺奔,地道東北人欣范。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恼琼。 傳聞我的和親對象是個殘疾皇子妨蛹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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