装饰者模式
插句设计模式的原则:类的设计原则,开放封闭原则,也就是类的设计要对将来扩展开放,对类的更改封闭。
定义:
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
规则:
1.装饰者和被装饰者对象有相同的超类型。
2.你可以用一个或多个装饰者包装一个对象。
3.既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
5.对象可以在任何时候被装饰,所以可以在运行时态地、不限量地用你自己喜欢的装饰者来装饰对象。
下面一个完整的例子,饮料(Beverage).
ClassDigram:
当用户选择一种咖啡(Espresso或DardRoast),然后选择调料(Milk或Sugar)来装饰咖啡,最后给出相应的花费getCost以及饮料的描述。
Beverage.h
- #if !defined(_BEVERAGE_H)
- #define _BEVERAGE_H
- #include <string>
- using namespace std;
- class Beverage
- {
- public:
- virtual string getDescription() = 0;
- virtual int getCost() = 0;
- protected:
- string _description;
- };
- #endif //_BEVERAGE_H
DardRoast.h
- #if !defined(_DARDROAST_H)
- #define _DARDROAST_H
- #include "Beverage.h"
- class DardRoast : public Beverage
- {
- public:
- string getDescription();
- int getCost();
- };
- #endif //_DARDROAST_H
Decorator.h
- #if !defined(_DECORATOR_H)
- #define _DECORATOR_H
- #include "Beverage.h"
- class Decorator : public Beverage
- {
- public:
- virtual string getDescription() = 0;
- virtual int getCost() = 0;
- protected:
- Beverage* _beverage;
- };
- #endif //_DECORATOR_H
Milk.h
- #if !defined(_MILK_H)
- #define _MILK_H
- #include "Decorator.h"
- class Milk : public Decorator
- {
- public:
- Milk(Beverage* b);
- virtual ~Milk();
- string getDescription();
- int getCost();
- private:
- Beverage* _beverage;
- };
- #endif //_MILK_H
Test.cpp
- #include "stdafx.h"
- #include "DardRoast.h"
- #include "Espresso.h"
- #include "Milk.h"
- #include "Sugar.h"
- int main(int argc, char* argv[])
- {
- printf("Hello World!\n");
- Beverage* coffee = new DardRoast();
- coffee = new Milk(coffee);
- printf("Coffee: desc=%s;cost=%d.\n",coffee->getDescription().c_str(),coffee->getCost());
- printf("------------------------------------------\n");
- Beverage* coffee2 = new Espresso();
- coffee2 = new Sugar(coffee2);
- coffee2 = new Milk(coffee2);
- printf("Coffee: desc=%s;cost=%d.\n",coffee2->getDescription().c_str(),coffee2->getCost());
- return 0;
- }
Output:
- Hello World!
- Coffee: desc=DarkRoast + milk.;cost=510.
- ------------------------------------------
- Coffee: desc=Espresso +Sugar. + milk.;cost=160.
- Press any key to continue
完整的工程代码,VC6.0工程。
阅读(907) | 评论(0) | 转发(0) |