原网址:https://blog.csdn.net/CoderAldrich/article/details/83115394
重点在于 ConcreteDecoratorA(Component *decorator) : Decorator(decorator)

前言

在实际开发时,你有没有碰到过这种问题;开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作;而有一些非核心的操作,可能会使用,也可能不会使用;现在该怎么办呢?

将这些非核心的操作全部放到类中,这样,一个类就包含了很多核心的操作和一些看似有关,但是又无关的操作;这就会使核心类发生“爆炸”的现象,从而使核心类失去了一定的价值,也使使用核心类的客户在核心操作和非核心操作中挣扎;
使用继承来扩展核心类,需要使用核心类时,直接建立核心类对象;当需要使用核心类扩展类时,就建立核心类扩展类对象;这样貌似是一种很有效的方法;但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;同时,又掉入了另一个陷阱,随着扩展功能的增多,子类也会增多,各种子类的组合,就会导致类的膨胀,最后,就会被淹没在类的海洋;此时,也不用我多说,你是不是想起了桥接模式,桥接模式就是为了适应多个维度的变化而发生子类“爆炸”的情况,但是,桥接模式是为了适应抽象和实现的不同变化,并不适用于我这里说的。那如何是好,这就要说到今天总结的装饰模式了。

什么是装饰模式?

在GOF的《设计模式:可复用面向对象软件的基础》一书中对装饰模式是这样说的:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。它使得我们可以给某个对象而不是整个类添加一些功能。

#include <iostream>
using namespace std;
class Component {public:virtual void Operation() = 0;
};
class ConcreteComponent : public Component {public:void Operation() {cout << " I am no decoratored ConcreteComponent" << endl;}
};
class Decorator : public Component {public:Decorator(Component *component) : component_obj_(component) {}void Operation() {if (component_obj_ != NULL) {component_obj_->Operation();}}protected:Component *component_obj_;
};
class ConcreteDecoratorA : public Decorator {public:ConcreteDecoratorA(Component *decorator) : Decorator(decorator) {}void Operation() {AddedBehavior();Decorator::Operation();}void AddedBehavior() {cout << "This is added behavior A" << endl;}
};
class ConcreteDecoratorB : public Decorator {public:ConcreteDecoratorB(Component *decorator) : Decorator(decorator){}void Operation() {AddedBehavior();Decorator::Operation();}void  AddedBehavior() {cout << "This is added behavior B" << endl;}
};
int main() {Component *pComponentObj = new ConcreteComponent();Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);pDecoratorAOjb->Operation();cout<<"============================================="<<endl;Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);pDecoratorBOjb->Operation();cout<<"============================================="<<endl;Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);pDecoratorBAOjb->Operation();cout<<"============================================="<<endl;delete pDecoratorBAOjb;pDecoratorBAOjb = NULL;delete pDecoratorBOjb;pDecoratorBOjb = NULL;delete pDecoratorAOjb;pDecoratorAOjb = NULL;delete pComponentObj;pComponentObj = NULL;
}  输出结果:
This is added behavior AI am no decoratored ConcreteComponent=============================================This is added behavior BI am no decoratored ConcreteComponent=============================================This is added behavior BThis is added behavior AI am no decoratored ConcreteComponent=============================================

C++设计模式——装饰模式(高屋建瓴)相关推荐

  1. 设计模式----装饰模式

    设计模式--装饰模式 "装饰模式(Decorator)"又名"包装模式(Wrapper)",通常用来灵活地扩充对象的功能. 在此之前我们可以通过类的继承来扩充父 ...

  2. 大话设计模式-装饰模式(大鸟和小菜Java版)

    装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...

  3. 大话设计模式—装饰模式

    装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  4. 设计模式--装饰模式

    目录 什么是装饰模式? 应用代码示例 装饰模式模板 jdk中的装饰模式 为什么装饰器类不能直接实现Component父类? 什么是装饰模式? 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油 ...

  5. C++设计模式-装饰模式

    目录 基本概念 代码和实例 基本概念 装饰模式是为已有功能动态地添加更多功能的一种方式. 当系统需要新功能的时候,是向旧系统的类中添加新代码.这些新代码通常装饰了原有类的核心职责或主要行为. 装饰模式 ...

  6. 李建忠设计模式——装饰模式

    1."单一职责"模式 在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Deco ...

  7. java设计模式——装饰模式

    装饰模式也称为包装模式.结构型设计模式之一,其使用一种对客户端透明的方式动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一. 装饰模式可以动态的给一个对象添加一些额外的职责.就增加功能功能来说 ...

  8. 设计模式——装饰模式详解

    0. 前言   写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇 ...

  9. 设计模式 | 装饰模式

    1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求. 相片的 ...

最新文章

  1. html表格以及form表单部分标签的使用
  2. Atitit。Web server Jetty9 使用 attilax 总结
  3. python章节总结_《Python深度学习》第一章总结
  4. 庖丁解牛看委托和事件(续)
  5. 4-希尔排序C实现(递增递减的简单转换)
  6. cad线加粗怎么设置_原来CAD的线条还可以这样加粗!还能修改初始单位!太实用了...
  7. 【AI视野·今日CV 计算机视觉论文速览 第238期】Fri, 1 Oct 2021
  8. 董明珠:我不是要把奥克斯整死 我希望它改邪归正
  9. 如何将示例bacpac文件导入到Azure SQL数据库
  10. vector容器易错知识点集锦
  11. Mac安装Docker及使用
  12. 高频交易揭:美国五大高频易访录
  13. juki贴片机是什么牌子,juki贴片机型号一览表
  14. 为什么说10月24日是程序员的节日?
  15. 学术-几何-维:超级立方体 (五维超级超立方体)
  16. 九爷带你了解 nginx优化
  17. 期货商品技术分析(期货市场技术分析)
  18. 03 day2--javascript笔记pink老师--对象
  19. 学习—吴恩达《机器学习》—手敲代码_准备工作之基于Ubuntu系统的 Anaconda(python环境)搭建
  20. Ubuntu 18.04 vscode 编辑器空格显示过小问题解决方案

热门文章

  1. 【C语言关键字】sizeof -- 被误解为函数的关键字
  2. 傻白入门芯片设计,先进封装技术(五)
  3. 论不良贷款拨备覆盖率的局限性和建议
  4. 计算机图形学应用基础考试,计算机图形学基础期末考试试题.docx
  5. 图片饱和度更改,c#,winform
  6. 富文本中添加字体选项功能_扑中的字体功能
  7. 练手——蚂蚁二面笔试题
  8. 2019ICPC亚洲区域赛南京网络赛
  9. 喜讯 | 南京南方电讯有限公司荣膺“2021中国年度优选雇主”称号
  10. 新版标准日本语初级_第六课