装饰模式:动态地给一个对象添加一些额外的职责
一般情况下可用继承实现类的功能拓展
#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;
}