作用:动态地给一个对象添加一些额外的职责。就增加功能来说,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. Java 编译错误:缺少返回语句

    示例: import java.util.*; import java.io.*; public class tt { public static void main(String[] args) { ...

  2. [hackerrank]Manasa and Stones

    https://www.hackerrank.com/contests/w2/challenges/manasa-and-stones 简单题. #include<iostream> us ...

  3. darwin转发时,摄像机在3G和4G模式下的参数设置

    darwin转发时,摄像机在3G和4G模式下的参数设置 我们转发的是摄像机的子码流,因为在不同的网络环境下,为了达到当前网络环境下最清晰,最流畅的目标,在转发前要根据使用的是3G还是4G及信号强度来自 ...

  4. linux下安装Apache(https) 服务器证书安装配置指南

    一.  安装准备 1.    安装Openssl 要使Apache支持SSL,需要首先安装Openssl支持.推荐下载安装openssl-0.9.8k.tar.gz   下载Openssl:http: ...

  5. Intellij IDEA新建一个EJB工程(二)

    从博文:http://www.cnblogs.com/yangyquin/p/5328344.html 中可以知道如何利用Intellij IDEA建立一个EJB Module,还有新建一个测试Mod ...

  6. 非常实用的PHP代码片段推荐

    当使用PHP进行开发的时候,如果你自己收 藏 了一些非常有用的方法或者代码片段,那么将会给你的开发工作带来极大的便利.今天我们将介绍10个超级好用的PHP代码片段,希望大家能够喜欢! 1.  使用te ...

  7. jsp获取struts2查询到的数据

    1.在struts2的方法中利用查询语句查询到结果,然后再对结果进行封装,jsp根据封装获取相关信息 struts2的查询和封装方法: private List<FreeMarkerDetail ...

  8. [ZOJ1610]Count the Colors(线段树,区间染色,单点查询)

    题目链接:http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=1610 题意:给一个长8000的绳子,向上染色.一共有n段被染色,问染 ...

  9. css实现缩进无限嵌套

    使用css实现缩进带背景无限嵌套,支持Ie6,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  10. org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locked dir异常解决方法

    myeclipse用svn提交的时候报错: Attempted to lock an already-locked dir svn: Working copy 'D:/Program Files/My ...