設(shè)計(jì)模式《裝飾模式》

引言

??繼續(xù)上一節(jié)的外觀模式,我們?cè)趤碚f裝飾模式冗尤。

示例地址

??Demo

類圖

image

定義

??動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)纱烘。就增加功能來說雳灵,裝飾模式相比生成子類更為靈活类嗤。

使用場(chǎng)景

??需要透明且動(dòng)態(tài)地?cái)U(kuò)展的功能時(shí)糊肠。

裝飾模式角色介紹

??1. Component:抽象組件,被裝飾的原始對(duì)象土浸。
??2. ConcreteComponent: 組件具體實(shí)現(xiàn)類罪针。裝飾的具體對(duì)象。
??3. Decorator:抽象的裝飾者黄伊,用來裝飾組件的。一般是為抽象類派殷。如果裝飾單一还最,該類可直接作為具體的裝飾者。
??4. ConcreteDecoratorA:裝飾者具體實(shí)現(xiàn)類毡惜。

裝飾模式示例

??最近幫別人買了手機(jī)拓轻。然后他自己貼了一個(gè)鋼化膜,買了一個(gè)手機(jī)外殼经伙,加上一個(gè)吊墜扶叉,格外的珍惜。不過比之前漂亮了不少帕膜。突然發(fā)現(xiàn)這是典型的裝飾模式啊枣氧。

1. 定義手機(jī)接口
/**
 * 手機(jī)
 *
 * @author 512573717@qq.com
 * @created 2018/7/25  下午5:30.
 */
public interface IPhone {
    //裝飾
    void decorate();
}
2. 實(shí)現(xiàn)手機(jī)接口(被裝飾的對(duì)象 華為手機(jī))
/**
 * 華為手機(jī)
 *
 * @author 512573717@qq.com
 * @created 2018/7/26  下午1:59.
 */
public class HuaWeiPhone  implements  IPhone{
    @Override
    public void decorate() {
        System.out.println("華為手機(jī)");
    }
}
3. 裝飾者(外殼)
/**
 * 外殼
 *
 * @author 512573717@qq.com
 * @created 2018/7/26  下午2:01.
 */
public abstract class Shell implements IPhone {

    private IPhone mHuaWeiPhone;

    public Shell(IPhone huaWeiPhone) {
        mHuaWeiPhone = huaWeiPhone;
    }

    @Override
    public void decorate() {
        mHuaWeiPhone.decorate();
    }
}
4. 粉紅色的外殼加掛墜
/**
 * 紅色的外殼
 *
 * @author 512573717@qq.com
 * @created 2018/7/26  下午2:05.
 */
public class RedShell extends Shell {

    public RedShell(IPhone huaWeiPhone) {
        super(huaWeiPhone);
    }

    public void shell() {
        System.out.println("粉紅色外殼");
    }

    public void pendant() {
        System.out.println("小豬佩奇掛件");
    }

    @Override
    public void decorate() {
        super.decorate();
        shell();
        pendant();
    }
}
5. 裝飾者(貼膜)

/**
 * 手機(jī)貼膜
 *
 * @author 512573717@qq.com
 * @created 2018/7/26  下午2:17.
 */
public abstract class Membrane implements IPhone {

    private IPhone mHuaWeiPhone;

    public Membrane(IPhone huaWeiPhone) {
        mHuaWeiPhone = huaWeiPhone;
    }

    @Override
    public void decorate() {
        mHuaWeiPhone.decorate();
    }
}
6. 貼鋼化膜
/**
 * 鋼化膜
 *
 * @author 512573717@qq.com
 * @created 2018/7/26  下午2:22.
 */
public class TemperingMembrane extends Membrane {

    public TemperingMembrane(IPhone huaWeiPhone) {
        super(huaWeiPhone);
    }

    public void pasting() {
        System.out.println("藍(lán)光鋼化膜");
    }

    @Override
    public void decorate() {
        super.decorate();
        pasting();
    }
}
7. Client
    IPhone phone = new HuaWeiPhone();

    System.out.println("裝飾外殼");
    RedShell redShell = new RedShell(phone);
    redShell.decorate();

    System.out.println("手機(jī)貼膜");
    TemperingMembrane temperingMembrane = new TemperingMembrane(redShell);
    temperingMembrane.decorate();

總結(jié)

??裝飾模式降低系統(tǒng)的耦合度,可以動(dòng)態(tài)的增加或刪除對(duì)象的職責(zé)垮刹,并使得需要裝飾的具體構(gòu)建類和具體裝飾類可以獨(dú)立變化达吞,以便增加新的具體構(gòu)建類和具體裝飾類。

??1. 優(yōu)點(diǎn):
????擴(kuò)展對(duì)象功能荒典,比繼承靈活酪劫,不會(huì)導(dǎo)致類個(gè)數(shù)急劇增加
????可以對(duì)一個(gè)對(duì)象進(jìn)行多次裝飾吞鸭,創(chuàng)造出不同行為的組合,得到功能更加強(qiáng)大的對(duì)象
????具體構(gòu)建類和具體裝飾類可以獨(dú)立變化覆糟,用戶可以根據(jù)需要自己增加新的具體構(gòu)件子類和具體裝飾子類

??2. 缺點(diǎn):
????產(chǎn)生很多小對(duì)象刻剥。大量小對(duì)象占據(jù)內(nèi)存,一定程度上影響性能
????裝飾模式易于出錯(cuò)滩字,調(diào)試排查比較麻煩

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末造虏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踢械,更是在濱河造成了極大的恐慌酗电,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件内列,死亡現(xiàn)場(chǎng)離奇詭異撵术,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)话瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門嫩与,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人交排,你說我怎么就攤上這事划滋。” “怎么了埃篓?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵处坪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我架专,道長(zhǎng)同窘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任部脚,我火速辦了婚禮想邦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘委刘。我一直安慰自己丧没,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布锡移。 她就那樣靜靜地躺著呕童,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罩抗。 梳的紋絲不亂的頭發(fā)上拉庵,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼钞支。 笑死茫蛹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烁挟。 我是一名探鬼主播婴洼,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撼嗓!你這毒婦竟也來了柬采?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤且警,失蹤者是張志新(化名)和其女友劉穎粉捻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑芜,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肩刃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杏头。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盈包。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醇王,靈堂內(nèi)的尸體忽然破棺而出呢燥,到底是詐尸還是另有隱情,我是刑警寧澤寓娩,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布叛氨,位于F島的核電站,受9級(jí)特大地震影響棘伴,放射性物質(zhì)發(fā)生泄漏力试。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一排嫌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缰犁,春花似錦淳地、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至并徘,卻和暖如春遣钳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背麦乞。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工蕴茴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劝评,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓倦淀,卻偏偏與公主長(zhǎng)得像蒋畜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撞叽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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