Design Patterns - Decorator - Example 1
来源:互联网 发布:淘宝 耳机diy 配件 编辑:程序博客网 时间:2024/06/18 10:53
#include <iostream>#include <string>using namespace std;// interface Beverageclass Beverage { public: virtual string getDescription() { if (description == "") { description = "Unknown Beverage"; } return description; } virtual double cost() = 0; protected: string description;};// interface CondimentDecorator externs Beverageclass CondimentDecorator : public Beverage { public: virtual string getDescription() = 0;};// implements Benverageclass Espresso : public Beverage { public: Espresso() { description = "Espresso"; } double cost() { return 1.99; }};class HouseBlend : public Beverage { public: HouseBlend() { description = "HouseBlend Coffee"; } double cost() { return 0.89; }};// implements CondimentDecoratorclass Mocha : public CondimentDecorator { public: Mocha(Beverage *beverage) : beverage(beverage) { } string getDescription() { return beverage->getDescription() + ", Mocha"; } double cost() { return 0.20 + beverage->cost(); } protected: Beverage *beverage;};class Soy : public CondimentDecorator { public: Soy(Beverage *beverage) : beverage(beverage) { } string getDescription() { return beverage->getDescription() + ", Soy"; } double cost() { return 0.11 + beverage->cost(); } protected: Beverage *beverage;};class Whip : public CondimentDecorator { public: Whip(Beverage *beverage) : beverage(beverage) { } string getDescription() { return beverage->getDescription() + ", Whip"; } double cost() { return 0.5 + beverage->cost(); } protected: Beverage *beverage;};// Exampleint main(int argc, char **argv) { Beverage *beverage = new Espresso(); cout << beverage->getDescription() << " $" << beverage->cost() << endl; Beverage *beverage2 = new HouseBlend(); beverage2 = new Mocha(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); cout << beverage2->getDescription() << " $" << beverage2->cost() << endl; return 0;}