您的位置:首页 > 其它

设计模式学习-Decorator装饰者模式

2014-04-04 13:57 190 查看
装饰模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

Beverage 饮料

       Espresso      浓咖啡

CondimentDecorator       配料,继承于Beverage类

        Mocha            摩卡

        Whip               奶泡

代码:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

//饮料
class Beverage
{
public:
Beverage()
{
}
virtual string getdescription() = 0;
virtual double cost() = 0;
string name;
};

class Espresso : public Beverage
{
public:
Espresso()
{
name = "Espresso";
}
double cost()
{
return 2.0;
}

string getdescription()
{
return name;
}
};

//配料
class CondimentDecorator : public Beverage
{
public:
Beverage* beverage;
};

//摩卡
class Mocha : public CondimentDecorator
{
public:
Mocha(Beverage* _beverage)
{
beverage = _beverage;
name = "Mocha";
}
double cost()
{
return beverage->cost() + 1.5;
}

string getdescription()
{
return beverage->getdescription() + "," + name;
}
};

//奶泡
class Whip : public CondimentDecorator
{
public:
Whip(Beverage* _beverage)
{
beverage = _beverage;
name = "Whip";
}
double cost()
{
return beverage->cost() + 0.9;
}

string getdescription()
{
return beverage->getdescription() + "," + name;
}
};

int main()
{
cout << "原味咖啡" << endl;
Beverage* p1 = new Espresso();
cout << p1->getdescription() << endl;
cout << "价格: " << p1->cost() <<endl;

Beverage* p2 = new Mocha(p1);
cout << p2->getdescription() << endl;
cout << "价格: " << p2->cost() <<endl;

Beverage* p3 = new Whip(p2);
cout << p3->getdescription() << endl;
cout << "价格: " << p3->cost() <<endl;

delete p3;
delete p2;
delete p1;

getchar();
return 0;
}将调料作为装饰类,可根据需要对饮料添加相应的调料。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: