設(shè)計模式-裝飾模式

模式動機

一般有兩種方式可以實現(xiàn)給一個類或?qū)ο笤黾有袨椋?/p>

  • 繼承機制,使用繼承機制是給現(xiàn)有類添加功能的一種有效途徑,通過繼承一個現(xiàn)有類可以使得子類在擁有自身方法的同時還擁有父類的方法。但是這種方法是靜態(tài)的,用戶不能控制增加行為的方式和時機;
  • 關(guān)聯(lián)機制,即將一個類的對象嵌入另一個對象中,由另一個對象來決定是否調(diào)用嵌入對象的行為以便擴展自己的行為,我們稱這個嵌入的對象為裝飾器(Decorator)

裝飾模式以對客戶透明的方式動態(tài)地給一個對象附加上更多的責任,換言之,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同。裝飾模式可以在不需要創(chuàng)造更多子類的情況下,將對象的功能加以擴展。這就是裝飾模式的模式動機。

模式定義

裝飾模式(Decorator Pattern) :動態(tài)地給一個對象增加一些額外的職責(Responsibility),就增加對象功能來說,裝飾模式比生成子類實現(xiàn)更為靈活。

模式結(jié)構(gòu)

裝飾模式包含如下角色:
Component: 抽象構(gòu)件
ConcreteComponent: 具體構(gòu)件
Decorator: 抽象裝飾類
ConcreteDecorator: 具體裝飾類

E21FB3FE-3BE0-48E4-B5A0-3D9E62CBD01F.png
模式分析

與繼承關(guān)系相比,關(guān)聯(lián)關(guān)系的主要優(yōu)勢在于不會破壞類的封裝性,而且繼承是一種耦合度較大的靜態(tài)關(guān)系,無法在程序運行時動態(tài)擴展。在軟件開發(fā)階段,關(guān)聯(lián)關(guān)系雖然不會比繼承關(guān)系減少編碼量,但是到了軟件維護階段,由于關(guān)聯(lián)關(guān)系使系統(tǒng)具有較好的松耦合性,因此使得系統(tǒng)更加容易維護。當然,關(guān)聯(lián)關(guān)系的缺點是比繼承關(guān)系要創(chuàng)建更多的對象。
使用裝飾模式來實現(xiàn)擴展比繼承更加靈活,它以對客戶透明的方式動態(tài)地給一個對象附加更多的責任。裝飾模式可以在不需要創(chuàng)造更多子類的情況下,將對象的功能加以擴展。

代碼分析
A6D12C41-9088-4E33-B8EF-64A8AE0691C7.png
5C9FA17D-66E7-49FC-A2EF-A8897F069729.png
優(yōu)點
  • 裝飾模式與繼承關(guān)系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性;
  • 可以通過一種動態(tài)的方式來擴展一個對象的功能,通過配置文件可以在運行時選擇不同的裝飾器,從而實現(xiàn)不同的行為;
  • 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一對象,得到功能更為強大的對象;
  • 具體構(gòu)件類與具體裝飾類可以獨立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合“開閉原則”。
缺點
  • 使用裝飾模式進行系統(tǒng)設(shè)計時將產(chǎn)生很多小對象,這些對象的區(qū)別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,同時還將產(chǎn)生很多具體裝飾類。這些裝飾類和小對象的產(chǎn)生將增加系統(tǒng)的復(fù)雜度,加大學習與理解的難度;
  • 這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調(diào)試時尋找錯誤可能需要逐級排查,較為煩瑣。
適用環(huán)境

在以下情況下可以使用裝飾模式:

  • 在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加職責;
  • 需要動態(tài)地給一個對象增加功能,這些功能也可以動態(tài)地被撤銷;
  • 當不能采用繼承的方式對系統(tǒng)進行擴充或者采用繼承不利于系統(tǒng)擴展和維護時。不能采用繼承的情況主要有兩類:第一類是系統(tǒng)中存在大量獨立的擴展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長;第二類是因為類定義不能繼承(如final類)。
模式擴展

裝飾模式的簡化-需要注意的問題:

一個裝飾類的接口必須與被裝飾類的接口保持相同,對于客戶端來說無論是裝飾之前的對象還是裝飾之后的對象都可以一致對待。
盡量保持具體構(gòu)件類Component作為一個“輕”類,也就是說不要把太多的邏輯和狀態(tài)放在具體構(gòu)件類中,可以通過裝飾類對其進行擴展。

實例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

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

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,960評論 1 15
  • 設(shè)計模式———裝飾模式 例子:成績單報告 在面向?qū)ο蟮脑O(shè)計中,如果超過兩層繼承,可能就出設(shè)計問題了。這是經(jīng)驗總結(jié),...
    書筆年華閱讀 406評論 0 0
  • 介紹 裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。繼承機...
    東西的南北閱讀 467評論 0 10
  • 1.裝飾模式的定義及使用場景定義:裝飾模式也稱為包裝模式,結(jié)構(gòu)型設(shè)計模式之一,其使用一種對客戶端透明的方式來動態(tài)地...
    GB_speak閱讀 280評論 0 0
  • 兩年之后的約定的我一直都記得,我知道兩年的空白期不會讓我愛你的那顆心改變,我怕的是等你兩年后會回來,我依舊是這個沒...
    c6ca2608c49d閱讀 181評論 0 1