c++设计模式之装饰器模式 学习笔记
装饰器模式的意义和字面意思相差不多——就是装饰的方法。比如人穿不同的衣服,在花园里栽种不同的花,游戏中的英雄带不同的装备等等。其中,人/花园/英雄是主体,是你要装备的东西;衣服/花/装备是装备物,是你要叠加到主体上的东西。核心是方法,要求灵活可复用(这也是我们编程的目的,为了灵活复用)。所以说理解装饰器模式,主要是理解其方法,在程序中就是类之间的关联关系,这种关联关系让你实现了类的灵活应用——想想你冬天穿衣服的时候,在你众多的衣服中,你可以随意搭配,能够套换多件衣服。
简言之,装饰器模式就是能够实现对目标主体进行功能的灵活叠加的方法。不同的功能可以写为不同的类。这些功能类用来修饰我们的目的主体,要求可以叠加修饰。
举个例子:
如果我们要为多个目标主体 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++设计模式之装饰器模式 学习笔记相关推荐
- 零基础学习设计模式之装饰器模式(配套视频)
零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...
- 【设计模式】装饰器模式的使用
问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...
- go设计模式之装饰器模式
go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 详解设计模式:装饰器模式
装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...
- javascript设计模式之装饰器模式(结构型模式)
javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...
- 设计模式之装饰器模式详解
设计模式之装饰器模式详解 文章目录 设计模式之装饰器模式详解 一.什么是装饰器模式 二.装饰器模式的角色组成 三.装饰器模式通用写法示例 四.装饰器模式业务中的应用举例 五.装饰器模式优缺点 一.什么 ...
- 初学Java常用设计模式之——装饰器模式
声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...
最新文章
- scanf函数详解与缓冲区
- 透过现象看本质-使用vs.net第二天
- Java 基础搞定了,还能学点什么?
- pytorch索引查找 index_select
- 计算机量子化学计算实验报告物化实验,experimental report:量子化学计算(HMO).pdf...
- Java中的锁[原理、锁优化、CAS、AQS]
- 时间序列预测 预测时间段_应用时间序列预测:美国住宅
- Python 只读属性的实现
- git clone出现fatal: HTTP request failed --git版本问题
- 开源之旅——应用服务器篇
- hash算法总结收集
- 二进制转格雷码c语言编程,格雷码简介及格雷码与二进制的转换程序
- 学校计算机室如何连接热点,电脑连热点怎么操作
- linux vi编译显示行号,Linux系统vi或者vim编辑器中如何显示行号
- 汽车超人:从电商到汽后新零售的华丽转身
- verilog编程,可能你一直在错误地使用计数器cnt
- 伊利诺伊大学厄本那 香槟分校计算机科学,美国伊利诺伊大学厄本那香槟分校专业设置...
- android网络连接的判断
- 怎样屏蔽浏览器关闭按钮及ALT+F4 快捷键
- Java程序员怎么迈向架构师