設計模式 (3)裝飾者模式

2021-08-17 07:00:13 字數 2556 閱讀 4368

動態的將責任附加到物件上,在擴充套件功能上,裝飾者提供了比繼承更有彈性的替代方案。(維護了開放封閉原則:對擴充套件開放,對修改封閉)

將裝飾者和具體元件組合,就是在加入新的行為。組合和委託可以在執行時動態的加上新的行為。而繼承雖然也屬於擴充套件形式之一,但是非彈性設計,而且依賴繼承,類的行為只能在編譯時靜態決定。

問題描述

設計不同種類的飲料,飲料可以新增配料,比如可以新增牛奶,並且支援動態新增新配料。每增加一種配料,該飲料的**就會增加,要求計算一種飲料的**。

下圖表示在 darkroast 飲料上新增新新增 mocha 配料,之後又新增了 whip 配料。darkroast 被 mocha 包裹,mocha 又被 whip 包裹。它們都繼承自相同父類,都有 cost() 方法,外層類的 cost() 方法呼叫了內層類的 cost() 方法。

具體元件(concretecomponent)和抽象裝飾者(decorator)都繼承自抽象元件(component),具體裝飾者(conceretedecoratora和conceretedecoratorb)繼承自抽象裝飾者。

具體元件的方法實現不需要依賴於其它物件,而裝飾者組合了乙個元件,這樣它可以裝飾其它裝飾者或者具體元件。所謂裝飾,就是把這個裝飾者套在被裝飾(具體元件)上,從而動態擴充套件被裝飾者的功能。裝飾者的方法有一部分是自己的,這屬於它的功能,然後呼叫被裝飾者的方法實現,從而也保留了被裝飾者的功能。可以看到,具體元件應當是裝飾層次的最低層,因為只有具體元件的方法實現不需要依賴於其它物件。

beverage: 飲料

darkroast :深培咖啡 house blend 首選咖啡

**實現

//元件介面(也可以抽象元件類)

public

inte***ce

beverage

//具體元件類houseblend

public

class

houseblend

implements

beverage

}//具體元件類darkroast

public

class

darkroast

implements

beverage

}//抽象裝飾者類 實現 元件介面

public

abstract

class

condimentdecorator

implements

beverage

//具體裝飾者類mocha

public

class

mocha

extends

condimentdecorator

@override

public

double

cost()

/*要計算帶mocha飲料的價錢,首先把呼叫委託給被裝飾物件,

以計算價錢,然後再加上mocha的價錢,得到最後結果。*/

}//具體裝飾者類milk

public

class

milk

extends

condimentdecorator

@override

public

double

cost()

}//主函式實現

public

class

startbuzzcoffee }輸出

inputstrean抽象元件fileinputstream(位元組讀取),

stringbufferinputstream,

bytearrayinputstream

以上三個是具體元件

filterinputstream是乙個抽象裝飾者

下面的繼承filterinputstream的類是具體裝飾者

例如:

linenumberinputstream :計算行數

bufferedinputstream:緩衝輸入來改進效能,其readline()方法來讀取一行文字輸入資料。

類應該對擴充套件開放,對修改關閉(開放封閉原則):也就是新增新功能時不需要修改**。

在本章問題中該原則體現在,飲料可以動態新增新的配料,而不需要去修改飲料的**。觀察者模式也符合這個原則。不可能把所有的類設計成都滿足這一原則,應當把該原則應用於最有可能發生改變的地方。

設計模式3 裝飾者模式

動態的將責任附加到物件上。想要擴充套件功能,裝飾者提供有別於繼承的另一種選擇 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合設計而努力 對擴充套件開放,對修改關閉 在購買咖啡時,可以要求在其中加入各種調料,例如 蒸奶,豆漿,摩卡等其他調料,會根據加入的不同...

設計模式3 裝飾者模式

0.序 裝飾模式 使用物件組合的方式,在執行時裝飾類。可以在不修改任何底層 的情況下,給物件賦予新的職責 1.咖啡店例項 問題所在 乙個飲料抽象父類beverage 當子類過多時,出現類的 性複雜 很明顯,這是難以維護的,出現乙個新的飲料就要去繼承父類。一種特例 雙倍奶泡咖啡,算一種飲料,三倍奶泡咖...

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...