装饰器模式的意义和字面意思相差不多——就是装饰的方法。比如人穿不同的衣服,在花园里栽种不同的花,游戏中的英雄带不同的装备等等。其中,人/花园/英雄是主体,是你要装备的东西;衣服/花/装备是装备物,是你要叠加到主体上的东西。核心是方法,要求灵活可复用(这也是我们编程的目的,为了灵活复用)。所以说理解装饰器模式,主要是理解其方法,在程序中就是类之间的关联关系,这种关联关系让你实现了类的灵活应用——想想你冬天穿衣服的时候,在你众多的衣服中,你可以随意搭配,能够套换多件衣服。
简言之,装饰器模式就是能够实现对目标主体进行功能的灵活叠加的方法。不同的功能可以写为不同的类。这些功能类用来修饰我们的目的主体,要求可以叠加修饰。
举个例子:
如果我们要为多个目标主体 A1,A2,A3,A4… (可以看作人物)分别从功能 B1,B2,B3,B4… (可以看作衣服)中选择合适的功能类进行叠加修饰。要求可以灵活组合和复用。
按照装饰器模式的思路。为了通讯的方便性,我们分别把同一类型的子类(人物类)汇总为一个中心类(人),通信的时候子类之间的信息以中心类为载体来传递叠加。

第一步 分别把同一类型的类汇总为一个中心类,并写出每个中心类的接口函数
主体类
class HumanA{ 接口函数:我现在穿的衣服是};//——我们现在探讨的就是人穿衣服(装饰)的话题,在这个话题中,人必须告诉我们他穿了什么衣服(装饰)
class Human A1: public HumanA {实现接口函数:我穿的衣服是a1};
class Human A2: public HumanA {实现接口函数:我穿的衣服是a2};
class Human A3: public HumanA {实现接口函数:我穿的衣服是a3};
功能类
class HumanClothesB{接口函数:我加了件衣服};//——我们现在探讨的就是人穿衣服(装饰)的话题,在这个话题中,衣服必须有加在人身上的能力
class HumanClothesB1: public HumanClothesB {实现接口函数:我加了件衣服b1};
class HumanClothesB2: public HumanClothesB {实现接口函数:我加了件衣服b2};
class HumanClothesB3: public HumanClothesB {实现接口函数:我加了件衣服b3};

第二步 转化为中心类进行通讯
关键点① 穿了衣服的人还是一个人,用c++语言来表达:class HumanClothesB: public HumanA
关键点② 衣服是叠加在身上,你现在穿的衣服=你刚穿上的衣服+你之前穿的衣服,衣服类具有穿衣服的功能,但是想要知道你现在穿的所有衣服,必须将之前穿的衣服告诉它。所以HumanClothesB类构造的时候,需要将你之前的衣服传给我。通信的方法肯定是通过基类HumanA变量来传递

不好理解?看代码:

//主体类
class HumanA
{
public: virtual void WoChuanDeFuYou()=0;
protected:string name;vector<string>  clothes;
};
class Human A1: public HumanA
{public: HumanA1: { name=“魔王”;clothes.push_back("背心");};virtual void WoChuanDeFuYou{ cout<<我是个<<name.c_str()<<我穿了一件背心};
};//注意,这里直接cout背心了,实际编程遍历一下输出
class Human A2: public HumanA{public: HumanA1: { name=“超人”;clothes.push_back("裤衩");};virtual void WoChuanDeFuYou{ cout<<我是个<<name.c_str()<<我穿了一件裤衩};};
class Human A3: public HumanA
{public: HumanA1: { name=“泡泡”;clothes.push_back("透明睡衣");};virtual void WoChuanDeFuYou{ cout<<我是个<<name.c_str()<<我穿了一件透明睡衣};
};
//功能类
class HumanClothesB: public HumanA
{
public: HumanClothesB(HumanA *human): m_human(human){ };virtual void WoChuanShangYiJianFuYou()=0;virtual void WoChuanDeFuYou{WoChuanShangYiJianFuYou();cout<<我是个<<name.c_str()<<我穿了一件**<<endl;  //遍历一下衣服输出};
protected: HumanA *m_human;
};
class HumanClothesB1: public HumanA
{
public: virtual void WoChuanShangYiJianFuYou{m_human->clothes.push_back("牛子裤");}
};
class HumanClothesB2: public HumanA
{
public: virtual void WoChuanShangYiJianFuYou{m_human->clothes.push_back("风衣");}
};
class HumanClothesB3: public HumanA
{
public: virtual void WoChuanShangYiJianFuYou{m_human->clothes.push_back("高跟鞋");}
};应用:
HumanA human1=new HumanA1();
HumanClothesB human1_plus=new HumanClothesB(human1);
HumanClothesB human1_plus1=new HumanClothesB1(human1_plus);
HumanClothesB human1_plus2=new HumanClothesB3(human1_plus1);
human1_plus2.WoChuanDeFuYou();//我是个魔王,我穿了一件背心,一件牛子裤和一双高跟鞋HumanA human1=new HumanA2();
HumanClothesB human1_plus=new HumanClothesB(human1);
HumanClothesB human1_plus1=new HumanClothesB2(human1_plus);
HumanClothesB human1_plus2=new HumanClothesB3(human1_plus1);
human1_plus2.WoChuanDeFuYou();//我是个超人,我穿了一件裤衩,一件风衣和一双高跟鞋//*****注意,这里面只有穿衣服的功能,你也可以加上脱衣服的功能。

c++设计模式之装饰器模式 学习笔记相关推荐

  1. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

  2. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  3. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  4. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  5. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  6. 详解设计模式:装饰器模式

    装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...

  7. javascript设计模式之装饰器模式(结构型模式)

    javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...

  8. 设计模式之装饰器模式详解

    设计模式之装饰器模式详解 文章目录 设计模式之装饰器模式详解 一.什么是装饰器模式 二.装饰器模式的角色组成 三.装饰器模式通用写法示例 四.装饰器模式业务中的应用举例 五.装饰器模式优缺点 一.什么 ...

  9. 初学Java常用设计模式之——装饰器模式

    声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...

最新文章

  1. scanf函数详解与缓冲区
  2. 透过现象看本质-使用vs.net第二天
  3. Java 基础搞定了,还能学点什么?
  4. pytorch索引查找 index_select
  5. 计算机量子化学计算实验报告物化实验,experimental report:量子化学计算(HMO).pdf...
  6. Java中的锁[原理、锁优化、CAS、AQS]
  7. 时间序列预测 预测时间段_应用时间序列预测:美国住宅
  8. Python 只读属性的实现
  9. git clone出现fatal: HTTP request failed --git版本问题
  10. 开源之旅——应用服务器篇
  11. hash算法总结收集
  12. 二进制转格雷码c语言编程,格雷码简介及格雷码与二进制的转换程序
  13. 学校计算机室如何连接热点,电脑连热点怎么操作
  14. linux vi编译显示行号,Linux系统vi或者vim编辑器中如何显示行号
  15. 汽车超人:从电商到汽后新零售的华丽转身
  16. verilog编程,可能你一直在错误地使用计数器cnt
  17. 伊利诺伊大学厄本那 香槟分校计算机科学,美国伊利诺伊大学厄本那香槟分校专业设置...
  18. android网络连接的判断
  19. 怎样屏蔽浏览器关闭按钮及ALT+F4 快捷键
  20. Java程序员怎么迈向架构师

热门文章

  1. (转)深入浅出Node.js(一):什么是Node.js
  2. 华为云黎江:打造支付平台化解决方案,直面现代支付体系新挑战
  3. 用python写文字语音转换器
  4. emoji 表情符号全集
  5. 介绍电力载波通信技术与目前的技术分类
  6. 使用python .pcm音频文件多声道数据分离与转化为浮点数
  7. 设计模式3——结构型模式
  8. java jmail_Java jmail邮件发送与不重复随机码 | 彬菌
  9. android ota功能,如何做android应用的OTA升级
  10. uniapp中的倒计时