裝飾模式

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

模式中的角色:

public abstract class Component {
    public abstract void Operation( );
}
  • 抽象構建(Component):定義一個抽象接口秩贰,用以給這些對象動態(tài)地添加職責霹俺。
public ConcreteComponent extends Component {
    public void Operation( ) {
        System.out.println("具體對象的操作");
    }
}
  • 具體構建(ConcreteComponent):定義一個具體的對象,也可以給這個對象添加一些職責毒费。
public class Decorator extends Component {

    protected Component component;
    public void Decorate (Component component){
        this.component = component;
    }
    
    public void Operation(){
        if (component != null){
            component.Operation();
        }
    }
}
  • 裝飾類(Decorator): 裝飾抽象類丙唧,繼承了Component,從外類來擴展Component類的功能。
public class ConcreteDecorator extends Decorator {

    private String addedState;
    public void Operation(){
        addedState = "New State";
        System.out.println("具體裝飾對象的操作");       
    }
}
  • 具體裝飾者(ConcretorDecorator):負責給構建對象添加職責觅玻。
裝飾模式

如果只有一個 ConcreteComponent 類想际,沒有抽象的 Component 類,那么 Decorator 類可以是 ConcreteComponent 類的子類串塑。

若只有一個 ConcreteDecorator 類沼琉,沒有必要建立單獨的 Decorator,將 Decorator 和 ConcreteDecorator 類的責任合并成一個類桩匪。

接下來打瘪,看一個具體實例:

Component 類:

public interface Coffee {  
    public double cost();  
}  

ConcreteComponent 類:

public class Espresso implements Coffee {  
    public double cost(){  
        return 2.5;  
    }  
}  

Decorator 類:

public class Dressing implements Coffee {  
    private Coffee coffee;  
      
    public Dressing(Coffee coffee){  
        this.coffee = coffee;  
    }  
      
    public double cost(){  
        return coffee.cost();  
    }  
}  

ConcretorDecorator 類:

public class Whip extends Dressing {  
    public Whip(Coffee coffee){  
        super(coffee);  
    }  
      
    public double cost(){  
        return super.cost() + 0.1;  
    }  
}  

public class Mocha extends Dressing {  
    public Mocha(Coffee coffee){  
        super(coffee);  
    }  
      
    public double cost(){  
        return super.cost() + 0.5;  
    }  
}  

裝飾模式是為已有功能動態(tài)地添加更多功能的一種方式。當系統(tǒng)需要新功能的時候,是向舊的類中添加新的代碼闺骚。這些新加的代碼(新的字段彩扔、方法、邏輯)通常裝飾了原有類的核心職責或主要行為僻爽,增加了主類的復雜度虫碉。
這些新加入的東西僅僅是滿足一些只在某種特定情況下才會執(zhí)行的特殊行為的需要。

裝飾模式提供了非常好的解決方案胸梆,它把每個要裝飾的功能放在單獨的類中敦捧,并讓這些類包裝它所要裝飾的對象。因此碰镜,當需要執(zhí)行特殊行為時兢卵,客戶代碼就可以在運行時根據(jù)需要有選擇地、按順序的使用裝飾功能包裝對象绪颖。

優(yōu)點:

  • 把類的裝飾功能從類中搬移去除秽荤,這樣可以簡化原有的類。
  • 有效的將類的核心職責和裝飾功能區(qū)分開柠横。而且可以去除相關類中重復的裝飾邏輯窃款。

需要注意的是:

  • 裝飾模式的裝飾順序很重要。
  • 加密數(shù)據(jù)牍氛、過濾詞匯→數(shù)據(jù)持久化的裝飾功能晨继。
  • 保證裝飾類之間彼此獨立。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糜俗,一起剝皮案震驚了整個濱河市踱稍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悠抹,老刑警劉巖珠月,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異楔敌,居然都是意外死亡啤挎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門卵凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庆聘,“玉大人,你說我怎么就攤上這事勺卢』锱校” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵黑忱,是天一觀的道長宴抚。 經(jīng)常有香客問我勒魔,道長,這世上最難降的妖魔是什么菇曲? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任冠绢,我火速辦了婚禮,結(jié)果婚禮上常潮,老公的妹妹穿的比我還像新娘弟胀。我一直安慰自己,他們只是感情好喊式,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布孵户。 她就那樣靜靜地躺著,像睡著了一般垃帅。 火紅的嫁衣襯著肌膚如雪延届。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天贸诚,我揣著相機與錄音,去河邊找鬼厕吉。 笑死酱固,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的头朱。 我是一名探鬼主播运悲,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼项钮!你這毒婦竟也來了班眯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烁巫,失蹤者是張志新(化名)和其女友劉穎署隘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亚隙,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡磁餐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阿弃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诊霹。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渣淳,靈堂內(nèi)的尸體忽然破棺而出脾还,到底是詐尸還是另有隱情,我是刑警寧澤入愧,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布鄙漏,位于F島的核電站嗤谚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泥张。R本人自食惡果不足惜呵恢,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媚创。 院中可真熱鬧渗钉,春花似錦、人聲如沸钞钙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芒炼。三九已至瘫怜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間本刽,已是汗流浹背鲸湃。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留子寓,地道東北人暗挑。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像斜友,于是被迫代替她去往敵國和親炸裆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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

  • 1 概述 在一個項目中鲜屏,你會有非常多的因素考慮不到烹看,特別是業(yè)務的變更,不時的冒出一個需求是很正常的情況洛史。有三個繼承...
    今晚打肉山閱讀 301評論 0 0
  • 0x01 前言 ??裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能惯殊,同時又不改變...
    菩提樹下成魔閱讀 412評論 0 0
  • 1. 概述 demo地址靠胜,歡迎star 2. 問題 3. 解決方案 裝飾器模式: 動態(tài)地給一個對象添加一些額外的...
    barry閱讀 262評論 0 0
  • 前段時間接觸到了裝飾模式,也做了基本的了解毕源,但是還不是很清楚它在iOS開發(fā)中的實際運用浪漠,和合理的存在方式。這兩天看...
    小胡子杰克閱讀 3,260評論 3 7
  • 需求 寫一個給人模擬搭配不同服飾的程序霎褐,可以給人換各種各樣的衣服褲子的形象址愿。 初步實現(xiàn) 需求比較簡單,直接上代碼:...
    Mr丶sorrow閱讀 761評論 0 2