【21】c++设计模式——>装饰模式

装饰模式的定义

装饰模式也可以称为封装模式,所谓的封装就是在原有行为之上进行扩展,并不会改变该行为;
例如网络通信:
在进行网络通信的时候,数据是基于IOS七层或四层网络模型(某些层合并之后就是四层模型)进行传输,通过下图可得知从应用层到物理层,数据每向下走一层就会被封装一层,最后将封装好的数据以比特流的方式发送给接收端。封装之后数据只是变得更复杂了, 并没有改变它是数据的本质。
【21】c++设计模式——>装饰模式_第1张图片
加解密是对数据的装饰,但是没有改变数据的本质。
防护服是对人的装饰,没有改变本体是人的本质。

装饰模式组成装饰模式是一种结构型设计模式,他允许你在运行时为对象动态的添加新的行为,而无需修改其源代码。

在装饰模式中,有四个主要角色:
抽象组件:定义了被装饰对象的接口,它可以是一个抽象类或接口。在抽象组件中定义了待装饰对象的基本操作;
具体组件:实现了抽象组件的接口,是被装饰的原始对象
装饰器:实现了抽象组件接口,并持有一个抽象组件对象的引用。装饰器可以通过对被装饰对象的包装来扩展其功能。
具体装饰器:具体装饰器是装饰器的具体实现,它通过在具体组件的基础上添加额外的功能来装饰对象。

代码实例

#include 
#include 
#include 
using namespace std;

/*我要做的是写一个吃了很多恶魔果实的黑胡子,
* 每吃一个恶魔果实,黑胡子就会获得相应的技能
* 这个就相当于装饰自己
*/
/*定义一个抽象战士类
*有了这个抽象类就可以对某个人,或者某个恶魔果实的战力进行具体的实现
*这个类有两个方向
* 1.派生出某个具体的战士,比如黑胡子
* 2.派生出恶魔果实类,因为战士是恶魔果实的载体,这些恶魔果实可以装饰这个战士
*/
class Soldier
{
public:
	Soldier() {}
	Soldier(string name) :m_name(name) {}
	string getName()
	{
		return m_name; //获取战士的名字
	}
	virtual void fight() {}  //所有战士都可以战斗
	virtual ~Soldier() {}
protected:
	string m_name = string(); //战士的名字
};
//实例化战士:黑胡子
class Teach :public Soldier
{
public:
	using Soldier::Soldier;//继承构造,使用父类的构造函数,不是很理解这个东西
	void fight() override
	{
		cout <<m_name << "依靠惊人的力量和高超的体术战斗..." << endl;
	}
};
/*恶魔果实基类
*这里一件很重要额操作就是指定载体,就是这个恶魔果实谁来吃
*这个还是个抽象类,因为没有重写父类的fight方法
*派生3个类:暗暗果实,大饼果实,震震果实
*/
class DevilFruit :public Soldier
{
public:
	//附魔函数,指定载体
	void enchantment(Soldier* soldier)
	{
		m_soldier = soldier;
		m_name = soldier->getName();
	}
protected:
	Soldier* m_soldier = nullptr;
};
/*暗暗果实
* 继承恶魔果实
*/
class DarkFruit :public DevilFruit
{
public:
	void fight() override
	{
		m_soldier->fight();//吃果实前的能力
		cout << m_soldier->getName()<< "吃了暗暗果实, 可以拥有黑洞一样的无限吸引力..." << endl;
	}
private:
	void warning() //定义类独有的方法
	{
		cout << m_soldier->getName()	<< "你要注意: 吃了暗暗果实, 身体元素化之后不能躲避攻击,会吸收所有伤害!" << endl;
	}
};

/*震震果实
* 继承恶魔果实
*/
class QuakeFruit :public DevilFruit
{
public:
	void fight() override
	{
		m_soldier->fight();
		cout << m_soldier->getName()			<< "吃了震震果实, 可以在任意空间引发震动, 摧毁目标...!" << endl;
	}
};

// 大饼果实
class PieFruit : public DevilFruit
{
public:
	void fight() override
	{
		m_soldier->fight();
		cout << m_soldier->getName()<< "吃了大饼果实, 获得大饼铠甲...!" << endl;
		ability();
	}

	void ability()
	{
		cout << "最强辅助 -- 大饼果实可以将身边事物变成大饼, 帮助自己和队友回血..." << endl;
	}
};
int main()
{
	Soldier* teach = new Teach("黑胡子");
	DevilFruit* dark = new DarkFruit;
	DevilFruit * quake = new QuakeFruit;
	DevilFruit* pie = new PieFruit;

	dark->enchantment(teach); //用暗暗果实装饰黑胡子
	quake->enchantment(dark); //用震震果实装饰吃了暗暗果实的黑胡子
	pie->enchantment(quake); //用大饼果实装饰吃了暗暗果实和震震果实的黑胡子

	pie->fight();

	delete pie;
	delete quake;
	delete dark;
	delete teach;

	return 0;

}

【21】c++设计模式——>装饰模式_第2张图片

你可能感兴趣的:(c++设计模式,c++,设计模式,开发语言)