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

时间:2022-07-23
本文章向大家介绍用C++跟你聊聊“装饰者模式”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前方低能,大家坐好跟我说一声,我们准备发车了。

从穿衣服小游戏谈起

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

装饰模式总结

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

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

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

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