作用:动态地给一个对象添加一些额外的职责。就增加功能来说,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. [转]Ubuntu alternate和desktop区别

    原文地址:http://blog.csdn.net/is2120/article/details/6797621 Desktop : 刻录在光盘,从光盘运行的系统,相当于 Live CD Altern ...

  2. [转]Ubuntu 12.04 安装屏保

    From:http://www.howtogeek.com/114027/how-to-add-screensavers-to-ubuntu-12.04/ How to Add Screensaver ...

  3. Oracle导出空表(从来都没有用过的表)

    Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出! .设置deferred_segment_creation参数为FALSE后,无论是空表还是 ...

  4. Project Euler 98:Anagramic squares 重排平方数

    Anagramic squares By replacing each of the letters in the word CARE with 1, 2, 9, and 6 respectively ...

  5. lintcode :reverse integer 颠倒整数

    题目: 颠倒整数 将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 样例 给定 x = 123,返回 321 给定 x = -123,返回 -321 解题: 直接 ...

  6. ADO,OLEDB,ODBC,DAO的区别

    ADO NET OLEDB ODBC连接数据库的区别 http://www.doc88.com/p-976312043296.html http://blog.csdn.net/ithomer/art ...

  7. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  8. React Jest测试

    一. var jest = require('jest'); jest.dontMock('../CheckboxWithLabel.js'); describe('CheckboxWithLabel ...

  9. linq 分类

    linq技术为我们开发人员提供了五个比较实用的数据访问类型: LinQ to Object:可以允许对内存中的类对象查询. LinQ to DataSet:可以对内存中的DataSet缓存数据,执行数 ...

  10. 3、REST风格的URL

    1.概述 HTTP协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE,它们分别对应四种基本的操作,GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删 ...