用C++跟你聊聊“装饰者模式”

举报
看,未来 发表于 2020/12/30 01:07:44 2020/12/30
【摘要】 前方低能,大家坐好跟我说一声,我们准备发车了。 从穿衣服小游戏谈起 不知道大家有没有玩过那种游戏啊,开局给你一个不知道穿多少的人,然后你找一堆衣服给人家穿上,如果要穿的好一点那你还得花点钱啊。反正我是没玩过,我的童年游戏时光,都给了死神VS火影了。 如果现在要你来实现这么一个小游戏,你会怎么弄?很不巧的是,前面讲过的工厂模式和策略模式好像都用不了。有的人可能要说了...

在这里插入图片描述前方低能,大家坐好跟我说一声,我们准备发车了。

从穿衣服小游戏谈起

不知道大家有没有玩过那种游戏啊,开局给你一个不知道穿多少的人,然后你找一堆衣服给人家穿上,如果要穿的好一点那你还得花点钱啊。反正我是没玩过,我的童年游戏时光,都给了死神VS火影了。

如果现在要你来实现这么一个小游戏,你会怎么弄?很不巧的是,前面讲过的工厂模式和策略模式好像都用不了。有的人可能要说了啊,我直接一个函数,衣服套套套就完事儿了。那可不太行,需要有不同的穿搭。能穿,你还得能脱呢。

那怎么搞?小事情,今天我们聊聊“装饰者模式”。

装饰者模式

装饰者模式:动态的给一个对象添加一些额外的附加功能。拿上边那个栗子来说,给你一小姑娘/小伙子,要怎么穿是你的事儿。

如果看过了前面上一篇 - 依赖倒转原则

那我们就来看一下类图吧

在这里插入图片描述
上面那个栗子讲的通透了,那我们现在按着这个类图做一个手机装饰示例

代码示例

#include<iostream>
#include<string>

using namespace std;

class Phone
{
public:
	Phone() {}
	virtual ~Phone() {}
	virtual void ShowDecorate() {}
};

//具体的手机类
class RongYao : public Phone
{
private:
	string m_name; //手机名称
public:
	RongYao(string name) : m_name(name) {}
	~RongYao() {}
	void ShowDecorate() { cout << m_name << "的装饰" << endl; }
};


//装饰主类
class DecoratorPhone : public Phone
{
private:
	Phone* m_phone;  //要装饰的手机
public:
	DecoratorPhone(Phone* phone) : m_phone(phone) {}
	virtual void ShowDecorate() { m_phone->ShowDecorate(); }
};


//具体的装饰类
class DecoratorPhoneA : public DecoratorPhone
{
public:
	DecoratorPhoneA(Phone* phone) : DecoratorPhone(phone) {}
	void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
	void AddDecorate() { cout << "钢化玻璃屏" << endl; } //增加的装饰
};

class DecoratorPhoneB : public DecoratorPhone
{
public:
	DecoratorPhoneB(Phone* phone) : DecoratorPhone(phone) {}
	void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
	void AddDecorate() { cout << "炫酷手机壳" << endl; } //增加的装饰
};

int main()
{
	Phone* RongYao9 = new RongYao("HUAWEIRONGYAO");
	Phone* dpa = new DecoratorPhoneA(RongYao9); //装饰,屏幕贴膜
	Phone* dpb = new DecoratorPhoneB(dpa); //装饰,增加挂件
	dpb->ShowDecorate();
	delete dpa;
	delete dpb;
	delete RongYao9;
	return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

装饰模式总结

上一个策略模式靠的是纯虚函数,这次,靠的是虚函数的使用。

装饰者模式是为已有实例动态的添加更多功能的一种方法。那么什么时候使用?
需要将类中的装饰部分分离出逻辑层的时候、需要给一个旧的类进行翻新的时候、对于一些特定情况下使用的特殊功能,可以使用装饰者模式套上去。

装饰者模式的一大有点就在于将类中的核心功能区与装饰层分离,这样可以简化原有的类。

不过有一点是要当心的:装饰者模式的装饰顺序是很重要的。

在这里插入图片描述

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/106093124

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。