裝飾者模式

2021-09-18 07:21:44 字數 2338 閱讀 3192

應用情況

給物件賦予超能力

動態的將責任附加到物件上。想要提供功能,裝飾者提供有別於繼承的另一種選擇。在不修改底層**的情況下,給物件賦予新的職責

孫悟空有72般變化,他的每一種變化帶來一種附加的本領。他變成魚兒時,就可以到水裡游泳;他變成雀兒時,就可以到天上飛。而在二郎神的眼裡,他永遠是那只猢猻

問題星巴茲(starbuzz)是以速度擴張最快而聞名的咖啡連鎖店,如果你在街角看到他的店,在對面的街上肯定還會看到另一家。因為擴張實在太快,他們準備更新訂單系統,以合乎他們的飲料**要求。下面使他們原先的設計

不合理原因

調整**會使我們更改現有的**

一旦出現新飲料,我們就需要加新的方法,並改變超類中的cost()方法

開發新飲料,對這些飲料而言可能並不合適,例如(冰茶)子類仍將繼承hashwhip()(加奶泡)

外衣顧客想要雙倍摩卡咖啡的話,將無法實現

以darkroast物件開始

顧客想要摩卡(mocha),所以建立乙個mocha物件,並用它將darkroast物件(wrap)起來

顧客也想要奶泡(whip),所以需要建立乙個whip裝飾者,並用它將mocha物件包裹起來。別忘了,darkroast繼承自beverage,且有乙個coast()方法,用來計算飲料**

現在為顧客算錢。通過呼叫最外圈的裝飾者(whip)的cost()就可以了辦得到。whip的cost()會先委託它裝飾的物件(也就是mocha)計算出**,然後在加上奶泡的**

將飲料當做大聖本身,調料當做大聖化生。每一次加入調料相遇於飲料增加一種功能。如大聖化為鳥被賦予飛的能力,化為魚擁有潛水的本領…但是不管怎麼變,猴子在二郎神的眼裡還是那個猢猻。飲料加了配料還是飲料

beverage(飲料)類

// 該類為抽象類

public

abstract

class

beverage

public

abstract

double

cost()

;}

實現condiment(調料)抽象類

public

abstract

class

condimentdecorator

extends

beverage

具體飲料

濃縮咖啡espresso

public

class

espresso

extends

beverage

public

double

cost()

}

綜合咖啡houseblend
public

class

houseblend

extends

beverage

public

double

cost()

}

具體配料 mocha

public

class

mocha

extends

condimentdecorator

public string getdescription()

public

double

cost()

}

測試類 starbuzzcoffee

public

class

starbuzzcoffee

}

裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...