作用:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

UML结构图:

抽象基类:

1)  Component :定义一个对象接口,可以为这个接口动态地添加职责。

2)  Decorator:维持一个指向Component的指针,并且有一个和Component一致的接口函数。

接口函数:

1)  Component::Operation:这个接口函数由Component声明,因此Component的派生类都需要实现,可以在这个接口函数的基础上给它动态添加职责。

解析:

Decorator的派生类可以为ConcreateComponent类的对象动态地添加职责,或者可以这么说:Decorator的派生类装饰ConcreateComponent类的对象。具体是这么实现的:

首先初始化一个ConcreateComponent类的对象(被装饰者),采用这个对象去生成一个Decorator对象(装饰者),之后对Operator函数的调用则是对这个Decorator对象成员函数的多态调用。这里的实现要点是Decorator类和ConcreateComponent类都继承自Component,从而两者的接口函数是一致的;其次,Decorator维护了一个指向Component的指针,从而可以实现对Component::Operation函数的动态调用

实现:

1)  Decorator.h

  1. #ifndef DECORATOR_H
  2. #define DECORATOR_H
  3. // 抽象基类,定义一个对象接口,可以为这个接口动态地添加职责
  4. class Component
  5. {
  6. public:
  7. Component(){}
  8. virtual ~Component(){}
  9. // 纯虚函数,由派生类实现
  10. virtual void Operation() = 0;
  11. };
  12. // 抽象基类,维护一个指向Component对象的指针
  13. class Decorator : public Component
  14. {
  15. public:
  16. Decorator(Component* pComponent) : m_pComponent(pComponent){}
  17. virtual ~Decorator();
  18. protected:
  19. Component* m_pComponent;
  20. };
  21. // 派生自Component,在这里表示需要给它动态添加职责的类
  22. class ConcreateComponent : public Component
  23. {
  24. public:
  25. ConcreateComponent(){}
  26. virtual ~ConcreateComponent();
  27. virtual void Operation();
  28. };
  29. // 派生自Decorator,这时代表为ConcreateComponent动态添加职责的类
  30. class ConcreateDecorator : public Decorator
  31. {
  32. public:
  33. ConcreateDecorator(Component* pComponent) : Decorator(pComponent){}
  34. virtual ~ConcreateDecorator() {}
  35. private:
  36. AddedBehavior();
  37. };
  38. #endif

Decorator.cpp

  1. #include "Decorator.h"
  2. #include <iostream>
  3. Decorator::~Decorator()
  4. {
  5. delete m_pComponent;
  6. m_pComponent = NULL;
  7. }
  8. void ConcreateComponent::Operation()
  9. {
  10. std::cout << "Operation of ConcreateComponent\n";
  11. }
  12. void ConcreateDecorator::Operation()
  13. {
  14. m_pComponent->Operation();
  15. AddedBehavior();
  16. }
  17. void ConcreateDecorator::AddedBehavior()
  18. {
  19. std::cout << "AddedBehavior of ConcreateDecorator\n";
  20. }

常见设计模式的解析和实现(C++)之九—Decorator模式的更多相关文章

  1. Javascript常见设计模式解析

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  2. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  3. SQL点滴26—常见T-SQL面试解析

    原文:SQL点滴26-常见T-SQL面试解析 它山之石可以攻玉,这一篇是读别人的博客后写下的,不是原原本本的转载,加入了自己的分析过程和演练.sql语句可以解决很多的复杂业务,避免过多的项目代码,下面 ...

  4. JavaScript 中常见设计模式整理

    开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式.本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知. JavaScript 中常见设计模 ...

  5. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  6. 一文读懂四种常见的XML解析技术

    之前的文章我们讲解了<XML系列教程之Schema技术_上海尚学堂java培训技术干货><XML的概念.特点与作用.XML申明_上海Java培训技术干货>,大家可以点击回顾一下 ...

  7. JS中常见设计模式总结

    github: https://github.com/14glwu/FEInterviewBox/tree/master/JS%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F ...

  8. 【Java基础】浅谈常见设计模式

    Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...

  9. java之 ------ DAO设计模式的【具体解释】及常见设计模式的【应用】

    DAO Data Access Object(数据訪问接口) 一.场景和问题 在Java程序中.常常须要把数据持久化,也须要获取持久化的数据.可是在进行数据持久化的过程中面临诸多问题(如:数据源 不同 ...

随机推荐

  1. 日期工具类TimeUnit

    import java.util.concurrent.TimeUnit; 2 3 public class TimeUnitDemo { 4 private TimeUnit timeUnit =T ...

  2. 李洪强iOS开发之上传照片时英文改中文

    今天在做项目的时候,有一个功能是上传照片选择系统相册的照片,或者拍照上传照片,但是页面上的文字是英文的, 需求想改成中文的,解决方法是在 info.plist里面添加 Localized resour ...

  3. lintcode:Binary Search 二分查找

    题目: 二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 ...

  4. ActiveMQ使用教程

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...

  5. iOS开发--多线程

    前面在<Bison眼中的iOS开发多线程是这样的(二)>一文中讲完了多线程的NSThread,不难发现这种方式的多线程实现起来非常的复杂,为了简化多线程的开发,iOS提供了GCD来实现多线 ...

  6. 在对话框上拖动按钮并移动该按钮(改写CXXButton::PreTranslateMessage,然后MoveWindow)

    // 派生自CButton类,主要过滤WM_LBUTTONDOWN .WM_LBUTTONUP和WM_MOUSEMOVE消息. BOOL m_bFlag = FALSE; // 成员变量,用来标示鼠标 ...

  7. 在屏幕上显示C盘根目录下的所有文件和文件夹

    1 import java.io.File; //在屏幕上显示C盘根目录下的所有文件和文件夹 public class ListDemo { public static void main(Strin ...

  8. Segmentation Fault错误原因总结

    最近在项目上遇到了Segmentation Fault的错误,一直调试不出来是哪里出了问题,对于刚接触嵌入式的,也不知道该如何去调试一个项目,定位内存问题,纠结了好几天,好阿红整理下自己的思路.从头开 ...

  9. Java中boolean型变量的默认值问题

    1.首先分析Java中的三种不同变量的区别,如下表所示   概念 默认值 其他 类变量 也叫静态变量,是类中独立于方法之外的变量 用static 修饰 有默认初始值,系统自动初始化. 如boolean ...

  10. [HDOJ4738]Caocao's Bridges(双联通分量,割边,tarjan)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 给一张无向图,每一条边都有权值.找一条割边,使得删掉这条边双连通分量数量增加,求权值最小那条. ...