装饰模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
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;
}
将调料作为装饰类,可根据需要对饮料添加相应的调料。