設計模式之裝飾模式

裝飾模式的通用類圖:

看看我們的示例代碼吧:

package 裝飾模式;

//被裝飾的類的抽象父類
public abstract class Component {
   public abstract void operation();
}
package 裝飾模式;
 
//需要被裝飾的具體類
public class Hourse extends Component {
 
    @Override
    public void operation() {
        System.out.println("這是一個普通的屋子庵佣。");
    }
}
 
package 裝飾模式;
 
//抽象裝飾類
public abstract class Decorator extends Component {
    //Component對象的引用
    private Component component;

    public Decorator(Component component) {
        this.component=component;
    }

    @Override
    public void operation() {
        this.component.operation();
    }
 
}
package 裝飾模式;
 
//具體裝飾類
public class DoorDecorator extends Decorator {
    public DoorDecorator(Component component){
        super(component);
    }
 
    @Override
    public void operation() {
        super.operation();
        System.out.println("裝飾了屋子的門,屋子變漂亮了。");
    }
}
package 裝飾模式;
 
//具體裝飾類
public class FurnitureDecorator extends Decorator{
 
public FurnitureDecorator(Component component) {
super(component);
}
 
    @Override
    public void operation() {
        super.operation();
        System.out.println("裝飾了屋子的家具劝篷,屋子變更漂亮了哨鸭。");
    }
}
package 裝飾模式;

//客戶端
public class Client {
   public static void main(String[]args){
   Component hourse=new Hourse();
   hourse.operation();
   //給屋子的門進行裝飾
   hourse=new DoorDecorator(hourse);
   hourse.operation();
   //給屋子的家具進行裝飾
   hourse=new FurnitureDecorator(hourse);
   hourse.operation();
   }
}

輸出:

這是一個普通的屋子。
這是一個普通的屋子娇妓。
裝飾了屋子的門像鸡,屋子變漂亮了。
這是一個普通的屋子哈恰。
裝飾了屋子的門只估,屋子變漂亮了。
裝飾了屋子的家具着绷,屋子變更漂亮了蛔钙。

關于裝飾模式的總結:

1、通過采用組合荠医、而非繼承的手法吁脱,Decorator模式實現(xiàn)了在運行時動態(tài)的擴展對象功能的能力,而且可以根據(jù)需要擴展多個功能彬向。避免了單獨使用繼承帶來的“靈活性差”和“多子類衍生問題”兼贡。
2、Component類在Decorator模式中充當抽象接口的角色娃胆,不應該去實現(xiàn)具體的行為遍希。而且Decorator類對于
Component類應該透明——換言之Component類無需知道Decorator類,Decorator類是從外部來擴展Component類的功能里烦。
3凿蒜、Decorator類在接口上表現(xiàn)為is-a Component的繼承關系,即Decorator類繼承了Component類所具有的接口招驴。但在實現(xiàn)上又表現(xiàn)為has-a Component的組合關系篙程,即Decorator類又使用了另外一個Component類。我們可以使用一個或多個Decorator對象來“裝飾”一個Component對象别厘,且裝飾后的對象仍然是一個Component
對象虱饿。我的理解是:當我們實例化一個Component對象后,要給這個對象擴展功能触趴,這時我們把這個Component對象當作參數(shù)傳給Decorator的子類的構造函數(shù)——也就是擴展方法的功能類氮发。對于引用類型傳參時,實際上只是傳遞對象的地址冗懦,也就是在原來的對象上擴展功能爽冕。
4、Decorator模式并非解決“多子類衍生的多繼承”問題披蕉,Decorator模式應用的要點在于解決“主體類在多個方向上的擴展功能”——是為“裝飾”的含義颈畸。Decorator是在運行時對功能進行組合乌奇。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眯娱,隨后出現(xiàn)的幾起案子礁苗,更是在濱河造成了極大的恐慌,老刑警劉巖徙缴,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试伙,死亡現(xiàn)場離奇詭異,居然都是意外死亡于样,警方通過查閱死者的電腦和手機疏叨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穿剖,“玉大人蚤蔓,你說我怎么就攤上這事⌒” “怎么了昌粤?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啄刹。 經(jīng)常有香客問我,道長凄贩,這世上最難降的妖魔是什么誓军? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮疲扎,結果婚禮上昵时,老公的妹妹穿的比我還像新娘。我一直安慰自己椒丧,他們只是感情好壹甥,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壶熏,像睡著了一般句柠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棒假,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天溯职,我揣著相機與錄音,去河邊找鬼帽哑。 笑死谜酒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的妻枕。 我是一名探鬼主播僻族,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼粘驰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了述么?” 一聲冷哼從身側響起晴氨,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碉输,沒想到半個月后籽前,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡敷钾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年枝哄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻荒。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡挠锥,死狀恐怖,靈堂內的尸體忽然破棺而出侨赡,到底是詐尸還是另有隱情蓖租,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布羊壹,位于F島的核電站蓖宦,受9級特大地震影響,放射性物質發(fā)生泄漏油猫。R本人自食惡果不足惜稠茂,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望情妖。 院中可真熱鬧睬关,春花似錦、人聲如沸毡证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽料睛。三九已至丐箩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秦效,已是汗流浹背雏蛮。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阱州,地道東北人挑秉。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像苔货,于是被迫代替她去往敵國和親犀概。 傳聞我的和親對象是個殘疾皇子立哑,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • (轉載)原文地址 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述裝飾(Decorator)模式的: 裝飾模式又...
    zjk_00閱讀 630評論 0 2
  • 裝飾模式 定義 裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴展對象的功能姻灶,是繼承關系的一...
    晨鳴code閱讀 1,319評論 0 0
  • 1 場景問題# 1.1 復雜的獎金計算## 考慮這樣一個實際應用:就是如何實現(xiàn)靈活的獎金計算铛绰。 獎金計算是相對復雜...
    七寸知架構閱讀 3,979評論 4 67
  • 裝飾模式 動態(tài)的給一個對象添加一些額外的職責,就增加功能來說产喉,裝飾模式比生成子類來的更為靈活捂掰。 Component...
    Keropok閱讀 1,033評論 0 1
  • 蟄伏的冬天 愛在緩緩積累 思念在徐徐滋長 陰郁的心情 層層疊疊地交織 春分踏青 小草卻說 我的身體過重了 于是 我...
    夜跑如風閱讀 293評論 0 2