Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1436560
  • 博文数量: 241
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2253
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:27
个人简介

--

文章分类

全部博文(241)

文章存档

2021年(3)

2019年(6)

2018年(1)

2017年(9)

2016年(21)

2015年(50)

2014年(125)

2013年(26)

我的朋友

分类: C/C++

2014-02-24 20:15:42

1、是什么?
    动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
2、为什么?
    对对象进行包装,每个装饰对象的实现就和如何使用这个对象分离开,每个装饰对象关心自己的功能,不用关心如何被添加到对象链中。
3、怎么样?
    首先创建基本的对象,通过装饰类创建新的装饰具体类,在基本对象基础上添加装饰,通过Decorator类添加装饰类,
    具体的UML类图:

4、示例代码

点击(此处)折叠或打开

  1. #include <iostream>

  2. using namespace std;

  3. class Component
  4. {
  5. public:
  6.     virtual void Operation() = 0;
  7. };
  8. class ConcreteComponent : public Component
  9. {
  10. public:
  11.     void Operation()
  12.     {
  13.         cout<<"具体对象操作!"<<endl;
  14.     }
  15. };
  16. class Decorator : public Component
  17. {
  18. public:
  19.     void setComponent(Component* cmt)
  20.     {
  21.         com = cmt;
  22.     }
  23.     void Operation()
  24.     {
  25.         if (com != NULL)
  26.         {
  27.             com->Operation();
  28.         }
  29.     }
  30. private:
  31.     Component* com;
  32. };

  33. class ConcreteA : public Decorator
  34. {
  35. public:
  36.     void Operation()
  37.     {
  38.         Decorator::Operation();
  39.         cout<<"添加装饰A"<<endl;
  40.     }
  41. private:
  42.     void AddOperation()
  43.     {
  44.     
  45.     }
  46. };

  47. class ConcreteB : public Decorator
  48. {
  49. public:
  50.     void Operation()
  51.     {
  52.         Decorator::Operation();
  53.         cout<<"添加装饰B"<<endl;
  54.     }
  55. private:
  56.     void AddOperation()
  57.     {
  58.     
  59.     }
  60. };
  61. void main()
  62. {
  63.     ConcreteComponent* com = new ConcreteComponent();
  64.     ConcreteA* comA = new ConcreteA();
  65.     ConcreteB* comB = new ConcreteB();

  66.     comA->setComponent(com);
  67.     comB->setComponent(comA);
  68.     comB->Operation();
  69. }

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