裝飾模式

裝飾模式又名包裝模式琐鲁。裝飾模式以對客戶端透明的方式擴展對象的功能菠齿,是繼承關系的一個替代方案。

動態(tài)地給一個對象添加一些額外的職責熙宇,就增加功能來說鳖擒,裝飾模式比生成子類更靈活。

原理:

增加一個修飾類包裹原來的類烫止,包裹的方式一般是通過在將原來的對象作為修飾類的構造函數(shù)的參數(shù)蒋荚。裝飾類實現(xiàn)新的功能,但是馆蠕,在不需要用到新功能的地方期升,它可以直接調用原來的類中的方法。修飾類必須和原來的類有相同的接口互躬。

好處:

  1. 使主功能和附加功能相分離播赁,可獨立擴展。
  2. 降低主功能和附加功能之間的耦合性吼渡。

模式中的角色

類圖:

image

2.1 抽象構建(Component):定義一個抽象接口行拢,用以給這些對象動態(tài)地添加職責。

2.2 具體構建(ConcreteComponent):定義一個具體的對象,也可以給這個對象添加一些職責舟奠。這個類是主功能類竭缝。

2.3 裝飾類(Decorator): 裝飾抽象類,繼承了Component,從外類來擴展Component類的功能沼瘫。

2.4 具體裝飾者(Decorator1,2,3):負責給構建對象添加職責抬纸。附加功能類。

下面是具體代碼實現(xiàn):

抽象構件類:裝飾類的公共接口

    public interface Component {  
        void sampleOperation();  
    }  

具體構件類(主功能類):

        public class ConcreteComponent implements Component{  
      
        public ConcreteComponent() {  
              
        }  
        @Override  
        public void sampleOperation() {  
            /*
            * 實現(xiàn)主功能
            */
            System.out.println("ConcreteComponent");  
        }  
          
    }  

裝飾類(所有附加功能類的父類):

    public class Decorator implements Component{  
        protected Component component;  
        public Decorator(Component component) {  
            this.component = component;//component為對另一個類對象的引用  
        }  
        public Decorator() {}  
        @Override  
        public void sampleOperation() {
            /*
            * 實現(xiàn)附加功能
            */
            component.sampleOperation();  
        }  
          
    }  

具體裝飾類(附加功能類):Decorator1

    public class Decorator1 extends Decorator{  
        public Decorator1(Component component) {  
            super(component);  
        }  
      
        @Override  
        public void sampleOperation() {
            /*
            * 實現(xiàn)附加功能
            */
            System.out.println("Decorator1");  
            component.sampleOperation();  
        }  
      
    }  

具體裝飾類(附加功能類):Decorator2

    public class Decorator2 extends Decorator {  
      
        public Decorator2(Component component) {  
            super(component);  
              
        }  
      
        @Override  
        public void sampleOperation() {  
            /*
            * 實現(xiàn)附加功能
            */
            System.out.println("Decorator2");  
            component.sampleOperation();  
        }  
    }  

具體裝飾類(附加功能類):Decorator3

    public class Decorator3 extends Decorator{  
      
        public Decorator3(Component component) {  
            super(component);  
        }  
      
        @Override  
        public void sampleOperation() {  
            /*
            * 實現(xiàn)附加功能
            */  
            System.out.println("Decorator3");  
            component.sampleOperation();  
        }  
          
    }  

客戶端:調用了Decorator1的sampleOperation()耿戚,實現(xiàn)了四個功能湿故。

    public class TestDecorator {  
      
        public static void main(String[] args) {  
            //定義主功能類
            ConcreteComponent c = new ConcreteComponent();
            
            //定義三個附加功能類。
            Decorator1 d1 = new Decorator3(c);
            Decorator2 d2 = new Decorator2(d1);
            Decorator1 d3 = new Decorator1(d2);//將三個功能都交給Decorator3
            //實現(xiàn)功能
            d1.sampleOperation();
        }  
      
    }  

輸出:

Decorator3

Decorator2

Decorator1

ConcreteComponent

總結:

優(yōu)點:

  1. 比靜態(tài)繼承更靈活 與對象的靜態(tài)繼承相比膜蛔,Decorator模式提供了更加靈活的向對象添加職責的方式坛猪,可以使用添加和分離的方法,用裝飾在運行時刻增加和刪除職責.
  2. 降低主功能和附加功能之間的耦合性皂股。
  3. 降低了主功能類的復雜度墅茉,遵循了開閉原則。

適用情景:

  1. 當需要為已有功能動態(tài)地添加更多功能時呜呐。
  2. 類的核心功能無需改變就斤,只是需要添加新的功能時。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蘑辑,一起剝皮案震驚了整個濱河市洋机,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洋魂,老刑警劉巖绷旗,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異副砍,居然都是意外死亡刁标,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門址晕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膀懈,“玉大人,你說我怎么就攤上這事谨垃∑袈В” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵刘陶,是天一觀的道長胳赌。 經常有香客問我,道長匙隔,這世上最難降的妖魔是什么疑苫? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上捍掺,老公的妹妹穿的比我還像新娘撼短。我一直安慰自己,他們只是感情好挺勿,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布曲横。 她就那樣靜靜地躺著,像睡著了一般不瓶。 火紅的嫁衣襯著肌膚如雪禾嫉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天蚊丐,我揣著相機與錄音熙参,去河邊找鬼。 笑死麦备,一個胖子當著我的面吹牛孽椰,可吹牛的內容都是我干的。 我是一名探鬼主播泥兰,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弄屡,長吁一口氣:“原來是場噩夢啊……” “哼题禀!你這毒婦竟也來了鞋诗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迈嘹,失蹤者是張志新(化名)和其女友劉穎削彬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秀仲,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡融痛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了神僵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雁刷。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖保礼,靈堂內的尸體忽然破棺而出沛励,到底是詐尸還是另有隱情,我是刑警寧澤炮障,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布目派,位于F島的核電站,受9級特大地震影響胁赢,放射性物質發(fā)生泄漏企蹭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谅摄。 院中可真熱鬧徒河,春花似錦、人聲如沸螟凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螺男。三九已至棒厘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間下隧,已是汗流浹背奢人。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淆院,地道東北人何乎。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像土辩,于是被迫代替她去往敵國和親支救。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • 咪蒙爆款文章分析: 1拷淘、從文章標題角度 標題:致賤人:我憑什么要幫你各墨?! 關鍵詞:賤人 憑什么 觸發(fā)點:首先每個人...
    Lxy林小隱閱讀 245評論 0 0
  • 德經 01(通行本38) 上德不德启涯,是以有德贬堵;下德不失德,是以無德结洼。上德無為而無以為也黎做;上仁為之而無以為也;上義為...
    王熙清閱讀 611評論 0 0
  • 以前想松忍,人生贏家蒸殿,是那些在事業(yè)中取得大成就的人。例如企業(yè)家鸣峭,做了很多的項目宏所,取得事業(yè)上的成就;明星叽掘,很有名氣楣铁,受到...
    陽光心程閱讀 416評論 8 9
  • 風波亭上出風波, 精忠報國真可笑更扁。 一日七令莫須有盖腕, 為何怒發(fā)不出鞘赫冬。
    簡村小吹閱讀 277評論 6 7