zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++装饰器模式

C++模式 装饰
2023-09-14 09:12:43 时间

学了C++基本的语法都知道继承可以让子类拥有更多的功能,除了继承还有组合,委托,也能让一个类的功能增加。设计模式,这个设计是设计继承,组合,委托,之间相互叠加的方式,让其符合业务需求。

装饰器模式是多态和托管的运用,它在一个类A中为类B修改或增加一些属性,增加或修改后,因为类A与类B同为一个基类的派生类(也可能派生多次),因此依然可以用基类的对象指针指向类B的实例。因此整体看来,好像为类A的实例装饰了一些属性一样。

这些代码都是在学习这些的过程中码的。。。。。
上代码,亲测有效!

#define		_CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//一般情况下 用继承实现类的功能扩展
//装饰器模式 可以动态的给一个类增加功能

//抽象英雄
class  AbstractHero
{
public:
	//展示能力
	virtual void ShowStatus() = 0;
	int mHp;//血量
	int mMp;//魔法
	int mAt;//攻击力
	int mDf;//防御力
};

//具体的英雄
class HeroA : public AbstractHero
{
public:
	//构造函数
	HeroA()
	{
		mHp = 0;
		mMp = 0;
		mAt = 0;
		mDf = 0;
	}
	//展示能力
	virtual void ShowStatus()
	{
		cout << "血量:" << mHp << endl;
		cout << "魔法:" << mMp << endl;
		cout << "攻击:" << mAt << endl;
		cout << "防御:" << mDf << endl;
	}
};

//英雄穿上某个装饰物 还是英雄
//抽象装饰物
//继承抽象英雄类,且数据成员化抽象英雄(对象指针)
class AbstractEquipment : public AbstractHero
{
public:
	//构造函数,调用抽象类英雄构造函数
	//给抽象类英雄类对象指针赋值
	AbstractEquipment(AbstractHero* hero)
	{
		this->pHero = hero;
	}
	//重写展示能力
	virtual void ShowStatus(){}
	//把英雄放到装饰物基类
	//定义对象指针,不算实例化
	AbstractHero* pHero;
};

//狂徒(衣服)
//孙子继承抽象英雄类,且孙子数据成员化抽象英雄
/*孙子化继承英雄使本类还是英雄
儿子化继承pHero,使本类可以修改抽象类英雄对象指针的值
之所以要有抽象的装饰类,是因为要有各种子类的装饰器*/
class KuangtuEquipment : public AbstractEquipment
{
public:
	//构造函数,调用基类构造函数,给基类数据数据成员:
	//抽象类英雄的对象指针赋值
	KuangtuEquipment(AbstractHero* hero) : AbstractEquipment(hero){}
	//额外增加功能
	void AddKuangtu()
	{
		//四个值孙子化继承抽象类英雄
		//PHero,儿子化继承抽象装饰物
		//在此类给pHero指针赋值后,去初始化
		//本类的四个值
		cout << "穿上狂徒后" << endl;
		this->mHp = this->pHero->mHp;
		this->mMp = this->pHero->mMp;
		this->mAt = this->pHero->mAt;
		//给穿狂徒,增加防御力
		this->mDf = this->pHero->mDf + 30;
		//释放空间
		delete this->pHero;
	}
	//重写展示能力,继承自抽象英雄
	virtual void ShowStatus()
	{
		AddKuangtu();
		cout << "血量:" << this->mHp << endl;
		cout << "魔法:" << this->mMp << endl;
		cout << "攻击:" << this->mAt << endl;
		cout << "防御:" << this->mDf << endl;
	}
};

//无尽之刃
class WujinKnife : public AbstractEquipment
{
public:
	WujinKnife(AbstractHero* hero) : AbstractEquipment(hero){}
	//额外增加功能
	void AddKuangtu()
	{
		cout << "装备无尽之刃后" << endl;
		this->mHp = this->pHero->mHp;
		this->mMp = this->pHero->mMp;
		//装备无尽之刃后,攻击类
		this->mAt = this->pHero->mAt + 80;
		this->mDf = this->pHero->mDf;
		//释放空间
		delete this->pHero;
	}
	//重写展示能力,继承自抽象英雄
	virtual void ShowStatus()
	{
		AddKuangtu();
		cout << "血量:" << this->mHp << endl;
		cout << "魔法:" << this->mMp << endl;
		cout << "攻击:" << this->mAt << endl;
		cout << "防御:" << this->mDf << endl;
	}
};

void test01()
{
	cout << "------下面是没加装备状态--------" << endl;
	AbstractHero* hero = new HeroA;
	hero->ShowStatus();
	cout << "--------给英雄穿上狂徒后---------" << endl;
	//给裸奔的英雄穿上英雄
	hero = new KuangtuEquipment(hero);
	hero->ShowStatus();
	cout << "------给英雄装备无尽之刃后-------" << endl;
	//给英雄装备武器
	hero = new WujinKnife(hero);
	hero->ShowStatus();
}

int main(void)
{
	test01();
	system("pause");
	return 0;
}


当你难受的时候,你要知道,你还有为自己鼓掌的时候