装饰者模式:动态地将责任附加到对象上。若要扩张功能,装饰者提供了比继承更有弹性的替代方案。
装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
装饰者与被装饰者对象具有相同的超类型。
#include <iostream>
#include <string>
using namespace std;
class Beverage
{
public :
string description ;
virtual string getDesciption()
{
return description;
}
virtual double cost()
{
return 0.0;
}
};
class CondimentDecorator : public Beverage
{
public:
virtual string getDesciption() = 0;
};
class Espresso : public Beverage
{
public :
Espresso()
{
description = "Espresso";
}
virtual double cost()
{
return 1.99;
}
};
class HouseBlend : public Beverage
{
public :
HouseBlend()
{
description = "houser blend coffee";
}
virtual double cost()
{
return 0.89;
}
};
class DarkRoast : public Beverage
{
public :
DarkRoast()
{
description = "DarkRoast coffee";
}
virtual double cost()
{
return 0.5;
}
};
class Mocha : public CondimentDecorator
{
public:
Beverage* beverage;
Mocha(Beverage* beverage)
{
this->beverage = beverage;
}
virtual string getDesciption()
{
return beverage->getDesciption() + ", Mocha";
}
virtual double cost()
{
return 0.20 + beverage->cost();
}
};
class Whip : public CondimentDecorator
{
public:
Beverage* beverage;
Whip(Beverage* beverage)
{
this->beverage = beverage;
}
virtual string getDesciption()
{
return beverage->getDesciption() + ", Whip";
}
virtual double cost()
{
return 0.30 + beverage->cost();
}
};
int main()
{
Beverage* beverage = new Espresso();
cout << beverage->getDesciption() << " $" << beverage->cost() << endl;
Beverage* beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
cout << beverage2->getDesciption() << " $" << beverage2->cost() << endl;
return 0;
}