装饰模式:包装模式,通过一种对客户端透明的方式来扩展对象功能,是继承关系的一种替代。装饰模式就是把要附加的功能分别放在单独的类中,并让这个类包含他要装饰的对象,当需要执行时,客户端就可以有选择的,按顺序的使用装饰模式功能包装对象
//一般情况下,可以用继承对类进行拓展
//装饰模式 可以动态给一个类增加功能
class AbstractHero{
public:
virtual void ShowStatus() = 0;
public:
int mHP;
int mMP;
int mAT;
int mDF;
};
class HeroA : public AbstractHero{
public:
HeroA(){
mHP = 10;
mMP = 10;
mAT = 10;
mDF = 10;
}
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() = 0;
public:
AbstractHero* pHero;
};
class KuangTuKaiJia : public AbstractEquipment{
public:
KuangTuKaiJia(AbstractHero* Hero):AbstractEquipment(Hero){
}
void addKuangTu(){
cout << "英雄已装备狂徒铠甲" <<endl;
this->mHP = this->pHero->mHP;
this->mMP = this->pHero->mMP;
this->mAT = this->pHero->mAT;
this->mDF = this->pHero->mDF + 100;
delete this->pHero;
}
virtual void ShowStatus(){
addKuangTu();
cout << "血量:" << mHP <<endl;
cout << "蓝量:" << mMP <<endl;
cout << "攻击:" << mAT <<endl;
cout << "防御:" << mDF <<endl;
}
};
class YinXieJian : public AbstractEquipment{
public:
YinXieJian(AbstractHero* Hero):AbstractEquipment(Hero){
}
void addYinXieJian(){
cout << "英雄已装备饮血剑" <<endl;
this->mHP = this->pHero->mHP;
this->mMP = this->pHero->mMP;
this->mAT = this->pHero->mAT+20;
this->mDF = this->pHero->mDF;
delete this->pHero;
}
virtual void ShowStatus(){
addYinXieJian();
cout << "血量:" << mHP <<endl;
cout << "蓝量:" << mMP <<endl;
cout << "攻击:" << mAT <<endl;
cout << "防御:" << mDF <<endl;
}
};
int main(){
AbstractHero* hero = new HeroA;
hero->ShowStatus();
hero = new KuangTuKaiJia(hero);
hero->ShowStatus();
hero = new YinXieJian(hero);
hero->ShowStatus();
delete hero;
return 0;
}
/*
血量:10
蓝量:10
攻击:10
防御:10
英雄已装备狂徒铠甲
血量:10
蓝量:10
攻击:10
防御:110
英雄已装备饮血剑
血量:10
蓝量:10
攻击:30
防御:110
*/