設(shè)計(jì)模式——裝飾器模式

裝飾模式又名包裝(Wrapper)模式柒啤。裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能枫疆,是繼承關(guān)系的一個(gè)替代方案爵川。

裝飾器模式(Decorator Pattern)的核心作用就是動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)功能。適用于透明且動(dòng)態(tài)擴(kuò)展類功能時(shí)息楔。這點(diǎn)注意跟適配器模式的區(qū)別:

  • 適配器模式主要是為了接口的轉(zhuǎn)換寝贡,而裝飾者模式關(guān)注的是通過(guò)組合來(lái)動(dòng)態(tài)的為被裝飾者注入新的功能或行為(即所謂的責(zé)任)。
  • 適配器將一個(gè)對(duì)象包裝起來(lái)以改變其接口值依;裝飾者將一個(gè)對(duì)象包裝起來(lái)以增強(qiáng)新的行為和責(zé)任圃泡;而外觀將一群對(duì)象包裝起來(lái)以簡(jiǎn)化其接口

這里我們可能會(huì)有疑問(wèn):為什么不使用繼承的方式進(jìn)行功能的擴(kuò)展呢?首先裝飾器模式是基于已存在類的功能進(jìn)行擴(kuò)展愿险,如果使用繼承的方式進(jìn)行實(shí)現(xiàn)颇蜡,需求后期都可能進(jìn)行變動(dòng),這樣增加很多需求辆亏,會(huì)導(dǎo)致子類出現(xiàn)太多风秤,所以就增加功能來(lái)說(shuō),裝飾器模式相比生成子類更為靈活扮叨。所以為確保后期動(dòng)態(tài)增加現(xiàn)有類的職責(zé)缤弦,將具體功能職責(zé)劃分,同時(shí)繼承裝飾者模式彻磁。

裝飾者的UML圖

UML
UML

裝飾模式的組成對(duì)象:

  • 抽象組件化對(duì)象(Component):規(guī)范實(shí)例接口碍沐,約束具體行為
  • 具體組件(ConcreteComponent):一個(gè)具體的接口實(shí)現(xiàn)類
  • 裝飾角色(Decorator):持有一個(gè)Component對(duì)應(yīng)的引用,用來(lái)擴(kuò)展類的功能衷蜓;
  • 具體的裝飾角色(ConcreteDecorator):根據(jù)需求進(jìn)行功能的擴(kuò)展累提;

實(shí)例代碼
講解裝飾模式使用最多的例子莫過(guò)于人穿衣服的例子,人穿衣戴帽就是裝飾的作用磁浇。

定義抽象類斋陪,人的角色

/**
 * 定義一個(gè)人的抽象類
 * @author Iflytek_dsw
 *
 */
abstract class People {
    private String name;
    public People(String name){
        this.name = name;
    }
    
    public abstract void dressed();
}

定義個(gè)具體的實(shí)例類實(shí)現(xiàn)接口,工人類

/**
 * 抽象類的角色 
 * @author Iflytek_dsw
 *
 */
class Worker extends People{

    public Worker(String name) {
        super(name);
    }

    @Override
    public void dressed() {
        System.out.println("穿工人裝");
    }
    
}

定義裝飾者角色

class PeopleDecorator extends People{
    private People people;

    public PeopleDecorator(People people, String name) {
        super(name);
        this.people = people;
    }

    @Override
    public void dressed() {
        people.dressed();
    }
}

定義裝飾的一個(gè)具體類

class HatDecorator extends PeopleDecorator{

    public HatDecorator(People people, String name) {
        super(people, name);
    }

    @Override
    public void dressed() {
        super.dressed();
        wearHat();
    }
    
    
    private void wearHat(){
        System.out.print("戴帽子");
    }
}

定義客戶端

public class Client {
    /**
     * @param args
     */
    public static void main(String[] args) {
        People people = new Worker("工人");
        //給工人帶個(gè)帽子
        HatDecorator hatDecorator = new HatDecorator(people, "工人");
        hatDecorator.dressed();
    }
}

從中可以看出來(lái),通過(guò)裝飾模式可以動(dòng)態(tài)給類增加新職責(zé)无虚。

優(yōu)點(diǎn)

  1. 裝飾模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能鞍匾,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統(tǒng)動(dòng)態(tài)決定“貼上”一個(gè)需要的“裝飾”骑科,或者除 掉一個(gè)不需要的“裝飾”橡淑。繼承關(guān)系則不同,繼承關(guān)系是靜態(tài)的咆爽,它在系統(tǒng)運(yùn)行前就決定了梁棠。
  2. 通過(guò)使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合斗埂。
  3. 裝飾類和被裝飾類可以獨(dú)立發(fā)展符糊,不會(huì)相互耦合,裝飾模式是繼承的一個(gè)替代模式呛凶,裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能男娄。

缺點(diǎn)

  1. 多層裝飾比較復(fù)雜,類的數(shù)量略多
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漾稀,一起剝皮案震驚了整個(gè)濱河市模闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崭捍,老刑警劉巖尸折,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異殷蛇,居然都是意外死亡实夹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門粒梦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亮航,“玉大人,你說(shuō)我怎么就攤上這事匀们〗闪埽” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵昼蛀,是天一觀的道長(zhǎng)宴猾。 經(jīng)常有香客問(wèn)我圆存,道長(zhǎng)叼旋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任沦辙,我火速辦了婚禮夫植,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己详民,他們只是感情好延欠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著沈跨,像睡著了一般由捎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饿凛,一...
    開(kāi)封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天狞玛,我揣著相機(jī)與錄音,去河邊找鬼涧窒。 笑死心肪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纠吴。 我是一名探鬼主播硬鞍,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼戴已!你這毒婦竟也來(lái)了固该?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤糖儡,失蹤者是張志新(化名)和其女友劉穎蹬音,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體休玩,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡著淆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拴疤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永部。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呐矾,靈堂內(nèi)的尸體忽然破棺而出苔埋,到底是詐尸還是另有隱情,我是刑警寧澤蜒犯,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布组橄,位于F島的核電站,受9級(jí)特大地震影響罚随,放射性物質(zhì)發(fā)生泄漏玉工。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一淘菩、第九天 我趴在偏房一處隱蔽的房頂上張望遵班。 院中可真熱鬧,春花似錦、人聲如沸狭郑。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翰萨。三九已至脏答,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亩鬼,已是汗流浹背以蕴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辛孵,地道東北人复亏。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓例获,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掖肋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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