應用情況
給物件賦予超能力
動態的將責任附加到物件上。想要提供功能,裝飾者提供有別於繼承的另一種選擇。在不修改底層**的情況下,給物件賦予新的職責
孫悟空有72般變化,他的每一種變化帶來一種附加的本領。他變成魚兒時,就可以到水裡游泳;他變成雀兒時,就可以到天上飛。而在二郎神的眼裡,他永遠是那只猢猻
問題星巴茲(starbuzz)是以速度擴張最快而聞名的咖啡連鎖店,如果你在街角看到他的店,在對面的街上肯定還會看到另一家。因為擴張實在太快,他們準備更新訂單系統,以合乎他們的飲料**要求。下面使他們原先的設計不合理原因
調整**會使我們更改現有的**
一旦出現新飲料,我們就需要加新的方法,並改變超類中的cost()方法
開發新飲料,對這些飲料而言可能並不合適,例如(冰茶)子類仍將繼承hashwhip()(加奶泡)
外衣顧客想要雙倍摩卡咖啡的話,將無法實現
以darkroast物件開始
顧客想要摩卡(mocha),所以建立乙個mocha物件,並用它將darkroast物件(wrap)起來
顧客也想要奶泡(whip),所以需要建立乙個whip裝飾者,並用它將mocha物件包裹起來。別忘了,darkroast繼承自beverage,且有乙個coast()方法,用來計算飲料**
現在為顧客算錢。通過呼叫最外圈的裝飾者(whip)的cost()就可以了辦得到。whip的cost()會先委託它裝飾的物件(也就是mocha)計算出**,然後在加上奶泡的**
將飲料當做大聖本身,調料當做大聖化生。每一次加入調料相遇於飲料增加一種功能。如大聖化為鳥被賦予飛的能力,化為魚擁有潛水的本領…但是不管怎麼變,猴子在二郎神的眼裡還是那個猢猻。飲料加了配料還是飲料beverage(飲料)類
實現condiment(調料)抽象類// 該類為抽象類
public
abstract
class
beverage
public
abstract
double
cost()
;}
具體飲料public
abstract
class
condimentdecorator
extends
beverage
濃縮咖啡espresso
綜合咖啡houseblendpublic
class
espresso
extends
beverage
public
double
cost()
}
具體配料 mochapublic
class
houseblend
extends
beverage
public
double
cost()
}
測試類 starbuzzcoffeepublic
class
mocha
extends
condimentdecorator
public string getdescription()
public
double
cost()
}
public
class
starbuzzcoffee
}
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...