Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46870
  • 博文数量: 14
  • 博客积分: 297
  • 博客等级: 二等列兵
  • 技术积分: 547
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-08 21:05
个人简介

努力做自己不喜欢的事情!

文章分类
文章存档

2013年(4)

2012年(10)

我的朋友

分类: C/C++

2012-07-28 19:28:09

装饰者模式
 
插句设计模式的原则:类的设计原则,开放封闭原则,也就是类的设计要对将来扩展开放,对类的更改封闭。
 
定义:
    装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
 
 
规则:
    1.装饰者和被装饰者对象有相同的超类型。
    2.你可以用一个或多个装饰者包装一个对象。
    3.既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
    4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
    5.对象可以在任何时候被装饰,所以可以在运行时态地、不限量地用你自己喜欢的装饰者来装饰对象。
 
 
下面一个完整的例子,饮料(Beverage).
ClassDigram:
 
    当用户选择一种咖啡(Espresso或DardRoast),然后选择调料(Milk或Sugar)来装饰咖啡,最后给出相应的花费getCost以及饮料的描述。
 
Beverage.h
  1. #if !defined(_BEVERAGE_H)
  2. #define _BEVERAGE_H
  3. #include <string>

  4. using namespace std;
  5. class Beverage
  6. {
  7. public:
  8.     virtual string getDescription() = 0;
  9.     virtual int getCost() = 0;
  10. protected:
  11.     string _description;
  12. };

  13. #endif //_BEVERAGE_H
DardRoast.h
  1. #if !defined(_DARDROAST_H)
  2. #define _DARDROAST_H

  3. #include "Beverage.h"

  4. class DardRoast : public Beverage
  5. {
  6. public:

  7.     string getDescription();
  8.     int getCost();
  9. };

  10. #endif //_DARDROAST_H
Decorator.h

  1. #if !defined(_DECORATOR_H)
  2. #define _DECORATOR_H

  3. #include "Beverage.h"

  4. class Decorator : public Beverage
  5. {
  6. public:
  7.     virtual string getDescription() = 0;
  8.     virtual int getCost() = 0;

  9. protected:
  10.     Beverage* _beverage;
  11. };

  12. #endif //_DECORATOR_H
Milk.h
  1. #if !defined(_MILK_H)
  2. #define _MILK_H

  3. #include "Decorator.h"

  4. class Milk : public Decorator
  5. {
  6. public:
  7.     Milk(Beverage* b);
  8.     virtual ~Milk();

  9.     string getDescription();
  10.     int getCost();
  11. private:
  12.     Beverage* _beverage;
  13. };

  14. #endif //_MILK_H
Test.cpp
  1. #include "stdafx.h"
  2. #include "DardRoast.h"
  3. #include "Espresso.h"
  4. #include "Milk.h"
  5. #include "Sugar.h"
  6. int main(int argc, char* argv[])
  7. {
  8.     printf("Hello World!\n");
  9.     Beverage* coffee = new DardRoast();
  10.     coffee = new Milk(coffee);
  11.     printf("Coffee: desc=%s;cost=%d.\n",coffee->getDescription().c_str(),coffee->getCost());
  12.     printf("------------------------------------------\n");
  13.     Beverage* coffee2 = new Espresso();
  14.     coffee2 = new Sugar(coffee2);
  15.     coffee2 = new Milk(coffee2);
  16.     printf("Coffee: desc=%s;cost=%d.\n",coffee2->getDescription().c_str(),coffee2->getCost());
  17.     return 0;
  18. }
Output:

  1. Hello World!
  2. Coffee: desc=DarkRoast + milk.;cost=510.
  3. ------------------------------------------
  4. Coffee: desc=Espresso +Sugar. + milk.;cost=160.
  5. Press any key to continue
 
完整的工程代码,VC6.0工程。






 
阅读(845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~