Java設計模式-裝飾器模式

Java程序員們應該對java.io對不會陌生炸卑,因為java.io包采用了裝飾器模式亡蓉。

一、定義:

Decorator裝飾器瞳浦,顧名思義担映,就是動態(tài)地給一個對象添加一些額外的職責,就好比為房子進行裝修一樣叫潦。因此蝇完,裝飾器模式具有如下的特征:

  • 它必須具有一個裝飾的對象
  • 它必須擁有與被裝飾對象相同的接口
  • 它可以給被裝飾對象添加額外的功能

用一句話總結就是:保持接口矗蕊,增強性能短蜕。

二、 典型的裝飾器模式的圖:

image.png

三傻咖、相關實例:

1朋魔、 Sourcable接口定義了一個方法 operation() 。

package pattern.decorator;     
public interface Sourcable {    
    public void operation();    
}  

2卿操、被裝飾對象: Source.java 是 Sourcable.java 的一個實現(xiàn)警检, operation() 方法的實現(xiàn)就是簡單的負責往控制臺輸出一個字符串:

public class Source implements Sourcable {    
    
    public void operation() {    
        System.out.println("原始類的方法");    
    }    
    
}    

3孙援、裝飾器類 Decorator1.java 采用了典型的對象適配器模式,它首先擁有一個 Sourcable 對象 source 扇雕,該對象通過構造函 數(shù)進行初始化拓售。然后它實現(xiàn)了 Sourcable.java 接口,以期保持與 source 同樣的接口镶奉,并在重寫的operation() 方法中調用 source 的 operation() 函數(shù)础淤,在調用前后可以實現(xiàn)自己的輸出,這就是裝飾器所擴展的功能哨苛。

public class Decorator1 implements Sourcable {    
    
    private Sourcable sourcable;    
    public Decorator1(Sourcable sourcable){    
        super();    
        this.sourcable=sourcable;    
    }    
        
    public void operation() {    
        System.out.println("第1個裝飾器前");    
        sourcable.operation();    
        System.out.println("第1個裝飾器后");    
    }     
}    

裝飾器類Decorator2.java 是另一個裝飾器值骇,不同的是它裝飾的內容不一樣,即輸出了不同的字符串移国。其源代碼如

public class Decorator2 implements Sourcable {    
    
    private Sourcable sourcable;    
    public Decorator2(Sourcable sourcable){    
        super();    
        this.sourcable=sourcable;    
    }    
    public void operation() {    
        System.out.println("第2個裝飾器前");    
        sourcable.operation();    
        System.out.println("第2個裝飾器后");    
    
    }    
    
}    

裝飾器類Decorator3.java 是第三個裝飾器吱瘩,不同的是它裝飾的內容不一樣,即輸出了不同的字符串迹缀。其源代碼如程序

public class Decorator3 implements Sourcable {    
    
    private Sourcable sourcable;    
    public Decorator3(Sourcable sourcable){    
        super();    
        this.sourcable=sourcable;    
    }    
    public void operation() {    
        System.out.println("第3個裝飾器前");    
        sourcable.operation();    
        System.out.println("第3個裝飾器后");    
    
    }    
    
}    

這時使碾,我們就可以像使用對象的適配器模式一樣來使用這些裝飾器,使用不同的裝飾器就可以達到不同的裝飾效果祝懂。如下測試類:首先需要創(chuàng)建一 個源類對象 source 票摇,然后根據(jù)將對象使用 Decorator1 來裝飾,并以此使用Decorator2 砚蓬、 Decorator3 進行裝飾矢门,裝飾后的對象同樣具有與 source 同樣的接口。

public class DecoratorTest {    
   
   /**  
    * @param args  
    */    
   public static void main(String[] args) {    
       Sourcable source = new Source();    
   
       // 裝飾類對象     
       Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));    
       obj.operation();    
   }    
   
}    

程序運行結果:
第1 個裝飾器裝飾前
第2 個裝飾器裝飾前
第3 個裝飾器裝飾前
原始類的方法
第3 個裝飾器裝飾后
第2 個裝飾器裝飾后
第1 個裝飾器裝飾后

總結:
裝飾器類:使用被裝飾器對象作為成員變量灰蛙,同時實現(xiàn)相同的接口祟剔。實現(xiàn)相同的接口,做成員變量

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末摩梧,一起剝皮案震驚了整個濱河市物延,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仅父,老刑警劉巖叛薯,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笙纤,居然都是意外死亡耗溜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門省容,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖拴,“玉大人,你說我怎么就攤上這事蓉冈〕俏瑁” “怎么了轩触?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長家夺。 經(jīng)常有香客問我脱柱,道長,這世上最難降的妖魔是什么拉馋? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任榨为,我火速辦了婚禮,結果婚禮上煌茴,老公的妹妹穿的比我還像新娘随闺。我一直安慰自己,他們只是感情好蔓腐,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布矩乐。 她就那樣靜靜地躺著,像睡著了一般回论。 火紅的嫁衣襯著肌膚如雪散罕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天傀蓉,我揣著相機與錄音欧漱,去河邊找鬼。 笑死葬燎,一個胖子當著我的面吹牛误甚,可吹牛的內容都是我干的。 我是一名探鬼主播谱净,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窑邦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岳遥?” 一聲冷哼從身側響起奕翔,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤裕寨,失蹤者是張志新(化名)和其女友劉穎浩蓉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宾袜,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡捻艳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了庆猫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片认轨。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖月培,靈堂內的尸體忽然破棺而出嘁字,到底是詐尸還是另有隱情恩急,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布纪蜒,位于F島的核電站衷恭,受9級特大地震影響,放射性物質發(fā)生泄漏纯续。R本人自食惡果不足惜随珠,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猬错。 院中可真熱鬧窗看,春花似錦、人聲如沸倦炒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逢唤。三九已至构罗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間智玻,已是汗流浹背遂唧。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吊奢,地道東北人盖彭。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像页滚,于是被迫代替她去往敵國和親召边。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容