相应的代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// base class
class Beverage
{
public:
virtual string getDescription() = 0;
virtual float cost() = 0;
};
// base class of condiment, also a base decorator class
class CondimentDecorator : public Beverage
{
protected:
Beverage *m_coffee;
};
// coffee DarkRoast
class DarkRoast: public Beverage
{
public:
string getDescription() {
return "Darkroast";
}
float cost() {
return 5.0;
}
};
// coffee Espresso
class Espresso: public Beverage
{
public:
string getDescription() {
return "Espresso";
}
float cost() {
return 6.5;
}
};
// condiment milk
class Milk: public CondimentDecorator
{
public:
Milk() {}
Milk(Beverage *coffee) {
m_coffee = coffee;
}
string getDescription() {
return m_coffee->getDescription() + ", Milk";
}
float cost() {
return m_coffee->cost() + 1.0;
}
};
// condiment mocha
class Mocha: public CondimentDecorator
{
public:
Mocha() {}
Mocha(Beverage *coffee) {
m_coffee = coffee;
}
string getDescription() {
return m_coffee->getDescription() + ", Mocha";
}
float cost() {
return m_coffee->cost() + 0.5;
}
};
int main()
{
Beverage *coffee = new Espresso;
coffee = new Milk(coffee);
coffee = new Mocha(coffee);
cout<<coffee->getDescription()<<" $"<<coffee->cost();
getchar();
return 0;
}
打印出:
Esprosso, Milk, Mocha &8