咖啡訂單系統(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