裝飾者模式

咖啡訂單系統(tǒng)

有一家咖啡連鎖店,發(fā)展的很快,所以他們準(zhǔn)備更新訂單系統(tǒng),以合乎他們的飲料供應(yīng)需求。
他們?cè)鹊念愂沁@樣設(shè)計(jì)的。。。


3-1

購(gòu)買咖啡時(shí),可以購(gòu)買不同的口味,例如:蒸奶(Steamed Milk),豆?jié){(Soy),摩卡(Mocha)或者奶泡。。。。??Х鹊旮鶕?jù)不同調(diào)料收取不同的費(fèi)用,訂單系統(tǒng)要考慮這些調(diào)料部分。
然后就必須一個(gè)口味繼承一下,可能還有不同口味的組合,比如一位顧客要了一杯雙份摩卡奶泡咖啡。。。。組合實(shí)在太多了,還要考慮以后出現(xiàn)的新口味,如果都這么繼承,那么將是“類爆炸”。維護(hù)的噩夢(mèng)。。。

認(rèn)識(shí)裝飾這模式

現(xiàn)在使用繼承無(wú)法解決問(wèn)題了,我們換一種思路,以飲料為主體,然后再運(yùn)行時(shí)以調(diào)料來(lái)“裝飾”(decorate)飲料。比方說(shuō)顧客想要摩卡和奶泡深焙咖啡。
1. 拿一個(gè)深焙咖啡對(duì)象(DaarkRoast)
2. 以摩卡(Mocha)對(duì)象裝飾它
3. 以奶泡(Whip)對(duì)象裝飾他
4. 調(diào)用cost()方法,并依賴委托(delegate)將調(diào)料價(jià)格加上去

3-2

裝飾者模式

動(dòng)態(tài)的將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。


3-3

裝飾我們的飲料

3-4

代碼實(shí)現(xiàn)

#include <iostream>
using namespace std;
//---------------------------------------------------
class Beverage{//飲料基類
public:
    virtual string getDescription(){return description;}
    virtual double cost()=0;
protected:
    string description;
};
//----------------------------------------------------
class DarkRoast:public Beverage{//深焙咖啡類
public:
    virtual double cost(){return costs;}
    DarkRoast(){description="DarkRoast";costs=1.5;}
private:
    double costs;
};

class CondimentDecorator:public Beverage{//佐料裝飾類
protected:
    double costs;
};
//------------------------------------------------------
class Mocha:public CondimentDecorator{//摩卡味
public:
    Beverage * beverage;
    Mocha(Beverage * pobj){description="Mocha";costs=2.0;beverage=pobj;}
    virtual double cost(){return costs+beverage->cost();}
    virtual string getDescription(){return description+beverage->getDescription();};
};
class Whip:public CondimentDecorator{//奶泡
public:
    Beverage * beverage;
    Whip(Beverage * pobj){description="Whip";costs=0.5;beverage=pobj;}
    virtual double cost(){return costs+beverage->cost();}
    virtual string getDescription(){return description+beverage->getDescription();};
};
//----------------------------------------------------------------------
int main(){
    Beverage * mywant;
    mywant = new DarkRoast();//深焙咖啡
    mywant = new Mocha(mywant);//加摩卡
    mywant = new Whip(mywant);//加奶泡
    cout<<mywant->getDescription()<<endl;
    cout<<mywant->cost()<<endl;
    return 0;
}
3-5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容