Decorator模式
1,核心:装饰者和被装饰者来自共同的基类.被装饰者由装饰者一层层地进行包裹.
2,实例代码:
#include <iostream>#include <list>#include <cassert>using namespace std;class Beverage //装饰者和被装饰者共同的基类{protected: Beverage() : _description( "Unknown Beverage" ) {}public: virtual ~Beverage() = 0;virtual std::string getDescription() const{return _description;}virtual double cost() const = 0;protected: string _description;};Beverage::~Beverage() {}/*****************************装饰者基类*************************************/class CondimentDecorator : public Beverage{protected: CondimentDecorator() {}private: CondimentDecorator( const CondimentDecorator& ); // Disable copy constructorvoid operator=( const CondimentDecorator& ); // Disable assignment operatorpublic: virtual ~CondimentDecorator() = 0; virtual string getDescription() const = 0;};CondimentDecorator::~CondimentDecorator() {}/*****************************装饰者*************************************/class Milk : public CondimentDecorator{public: explicit Milk( const Beverage* beverage ) : _beverage( beverage ) { assert( beverage );}~Milk(){delete _beverage;} string getDescription() const {return _beverage->getDescription() + ", Milk";} double cost() const {return 0.10 + _beverage->cost(); //这里是核心}private: const Beverage* _beverage;};class Whip : public CondimentDecorator{public: explicit Whip( const Beverage* beverage ) :_beverage( beverage ) { assert( beverage );}~Whip(){delete _beverage;}string getDescription() const{return _beverage->getDescription() + ", Whip";}double cost() const{return 0.10 + _beverage->cost();}private: const Beverage* _beverage;};class Mocha : public CondimentDecorator{public: explicit Mocha( Beverage* beverage ) :_beverage( beverage ) { assert( beverage );}~Mocha(){delete _beverage;}string getDescription() const{return _beverage->getDescription() + ", Mocha";}double cost() const{return 0.20 + _beverage->cost();}private: const Beverage* _beverage;};class Soy : public CondimentDecorator{public: explicit Soy( const Beverage* beverage ) :_beverage( beverage ) { assert( beverage );}~Soy(){delete _beverage;}string getDescription() const{return _beverage->getDescription() + ", Soy";}double cost() const{return 0.15 + _beverage->cost();}private: const Beverage* _beverage;};/*****************************被装饰者*************************************/class DarkRoast : public Beverage{public: DarkRoast(){_description = "Dark Roast Coffee";}double cost() const{return 0.99;}};class Decaf : public Beverage{public: Decaf() {_description = "Decaf Coffee";}double cost() const{return 1.05;}};class Espresso : public Beverage{public: Espresso() {_description = "Espresso";}double cost() const{return 1.99;}};class HouseBlend : public Beverage{public: HouseBlend() {_description = "House Blend Coffee";}double cost() const{return 0.89;}};int main(){ Beverage* beverage = new Espresso();cout.setf( ios::showpoint);cout.precision(3);cout << beverage->getDescription() << " $"<< beverage->cost()<< endl;Beverage* beverage2 = new DarkRoast();beverage2 = new Mocha(beverage2); //加咖啡beverage2 = new Mocha(beverage2); //加双份咖啡beverage2 = new Whip(beverage2);//加麦cout << beverage2->getDescription()<< " $"<< beverage2->cost()<< endl;Beverage* beverage3 = new HouseBlend();beverage3 = new Soy(beverage3);beverage3 = new Mocha(beverage3);beverage3 = new Whip(beverage3);cout << beverage3->getDescription()<< " $"<< beverage3->cost()<< endl;delete beverage3;delete beverage2;delete beverage; return 0;}
页:
[1]