12.装饰模式

  装饰模式:动态地给一个对象添加一些额外的职责

  一般情况下可用继承实现类的功能拓展

           

#include <iostream>
using namespace std;

// 英雄抽象类
class AbstractHero
{
public:
	virtual void show_status() = 0;

public:
	int m_Hp;	// 生命值
	int m_Mp;	// 魔法值
	int m_At;	// 攻击力
	int m_Df;	// 防御力
};

// 具体英雄:盖伦
class GaiLun : public AbstractHero
{
public:
	GaiLun()
	{
		m_Hp = 0;
		m_Mp = 0;
		m_At = 0;
		m_Df = 0;
	}

	void show_status()
	{
		cout << "血量:" << m_Hp << endl;
		cout << "魔法:" << m_Mp << endl;
		cout << "攻击:" << m_At << endl;
		cout << "防御:" << m_Df << endl;
		cout << endl;
	}
};

// 给英雄添加装饰物,他依旧还是个英雄
class AbstractEquipment : public AbstractHero
{
public:
	AbstractEquipment(AbstractHero* hero)
	{
		this->pHero = hero;
	}
	virtual void show_status() {};

public:
	AbstractHero* pHero;
};

// 红莲斗篷
class Doupeng : public AbstractEquipment
{
public:
	Doupeng(AbstractHero* hero) : AbstractEquipment(hero) {}
	// 增加额外功能
	void add_doupeng()
	{
		cout << "英雄装备红莲斗篷之后: " << endl;
		this->m_Hp = this->pHero->m_Hp;
		this->m_Mp = this->pHero->m_Hp;
		this->m_At = this->pHero->m_At;
		this->m_Df = this->pHero->m_Df + 100;

		delete this->pHero;
	}

	void show_status()
	{
		add_doupeng();
		cout << "血量:" << m_Hp << endl;
		cout << "魔法:" << m_Mp << endl;
		cout << "攻击:" << m_At << endl;
		cout << "防御:" << m_Df << endl;
		cout << endl;
	}
};

// 无尽之刃
class Wujin : public AbstractEquipment
{
public:
	Wujin(AbstractHero* hero) : AbstractEquipment(hero) {}
	//增加额外功能
	void add_wujin()
	{
		cout << "英雄装备无尽之刃之后: " << endl;
		this->m_Hp = this->pHero->m_Hp;
		this->m_Mp = this->pHero->m_Mp;
		this->m_At = this->pHero->m_At + 100;
		this->m_Df = this->pHero->m_Df;

		delete this->pHero;
	}

	void show_status()
	{
		add_wujin();
		cout << "血量:" << m_Hp << endl;
		cout << "魔法:" << m_Mp << endl;
		cout << "攻击:" << m_At << endl;
		cout << "防御:" << m_Df << endl;
		cout << endl;
	}
};

void test_01()
{
	cout << "英雄初始化状态: " << endl;
	AbstractHero* hero = new GaiLun;
	hero->show_status();

	// 装备红莲斗篷
	hero = new Doupeng(hero);
	hero->show_status();

	// 装备无尽之刃
	hero = new Wujin(hero);
	hero->show_status();
}

int main()
{
	test_01();

	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值