裝飾者模式decorator

2021-07-01 23:06:11 字數 2292 閱讀 4270

設計原則:

開放-關閉原則,對擴充套件開放,對修改封閉

多用組合,少用繼承

針對介面程式設計,不針對實現程式設計

為互動物件之間的松耦合設計而努力

類圖待補充

示例:飲料銷售系統

主體飲料:coffe

輔助調料:mocha,soy,whip。。

輔助調料價位都不一樣,當輔助調料和主飲料不同搭配時,最終飲料價錢和飲料名稱都不一樣

如客戶要:coffe+mocha,或者coffe+whip等等

假如我們使用簡單繼承方式,定義乙個基類coffe,其他任意飲料組合都繼承自該基類,那麼如果主飲料和輔助飲料有上百種組合

那麼我們就要定義上百個基類,因為每種組合價錢和配料不一樣;而且,當某一中調料價位發生變化時候,可能上百個用到這種調料的類都要修改。

因此,基於oo原則的關-閉原則,選擇裝飾模式,

飲料當作元件(被裝飾者,用輔助調料裝飾飲料成為不同口感售賣飲料)

調料作為裝飾者

(見上面類圖)

show code

1.調料基類

/**

* created by supertool on 15-4-21.

* 飲料抽象類

*/public abstract class beverage

// 飲料**

public abstract double

cost();

}

被裝飾者具體類(即每種咖啡)

例如意式濃縮咖啡

public class espresso extends beverage 

// 不許要管調料價錢,只需把設定

espresso

價錢@override

public double

cost()

}

2.裝飾者

裝飾者抽象類

/**

* created by supertool on 15-4-21.

* 調料裝飾

base class

*/public abstract class codimentdecorator extends beverage

裝飾者具體類(即每種調料)

/**

* created by supertool on 15-4-21.

*/public class mochadecorator extends codimentdecorator

@override

public string getdescription()

@override

public double

cost()

}

/**

* created by supertool on 15-4-21.

*/public class soydecorator extends codimentdecorator

@override

public string getdescription()

@override

public double

cost()

}

/**

* created by supertool on 15-4-21.

*/public class whipdecorator extends codimentdecorator

@override

public string getdescription()

@override

public double

cost()

}

3.客戶類

點一杯帶mocha的濃咖啡

/**

* created by supertool on 15-4-21.**/

public class coffestoreclient

}

來一杯whio濃咖啡

public class coffestoreclient 

}

這樣飲料銷售系統做成了

當飲料價位發生變化時候,我們只需要修改某乙個具體類,而不用修改很多類

當有新品種飲料時候,我們只需繼承增加新類即可構造出新飲料。

但是由上述例子可以看出,當有很多飲料時,會出現非常多的類,這回導致類**,導致最終整個飲料選單點菜時候混亂

後續會有工廠模式和生成器模式來解決這些問題。

裝飾者(Decorator)模式

裝飾者模式是允許向乙個新物件新增新的功能,但又不改變其結構。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。就增加功能來說,裝飾器模式相比生成子類更為靈活。例子 如果我們去咖啡店,有一種咖啡,該咖啡可以加糖,牛奶,奶泡等等,如果我們需要加糖和牛奶,常規...

裝飾者模式 Decorator

1 作用 動態的給物件增加執行的業務,不受數量限制。可以代替子類,同時避免子類與父類的高耦合。增加靈活性。2 構成 2.1 裝飾者抽象類 decorator 可以是介面 最終生成乙個指向被裝飾物件基類 component 例項的引用,並定義乙個與被裝飾物件基類 component 介面一致的介面。通...

裝飾者模式 Decorator

裝飾者模式 動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活 要點1.繼承屬於擴充套件形式之一,但不見得是達到彈性設計的最佳方式 2.應該允許行為可以被擴充套件,而無須修改現有的 3.組合...