装饰模式
装饰模式又叫包装模式,通过一种对客户端透明的方式来扩展对象功能,是继承关系的一种替代。
装饰模式就是把要附加的功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择的、按顺序的使用装饰功能包装对象。
比如:给小人穿衣服。可以穿背心,裤衩,裤兜子等。如果使用继承,小人需要继承背心,继承裤衩,继承裤兜子,这样继承关系复杂,代码维护起来不方便。
#include<iostream>
using namespace std;
//装饰模式
//一般情况下,用继承实现类功能的扩展
//装饰模式 可以动态给类增加功能
//抽象英雄,英雄共有的行为
class AbstractHero{
public:
virtual void ShowStatus() = 0;
public:
//属性值
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(){}//让子类去实现这个函数
public:
AbstractHero* pHero;
};
//具体装备,如狂徒铠甲
class KuangTuEquipment : public AbstractEquipment{
public:
//这里要调用基类函数哦!!!
KuangTuEquipment(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 + 30;
delete this->pHero;
}
virtual void ShowStatus(){
AddKuangtu();
cout<<"血量:"<< mHp << endl;
cout<<"魔法:"<< mMp << endl;
cout<<"攻击:"<< mAt << endl;
cout<<"防御:"<< mDf << endl;
}
};
class Wujinzhiren : public AbstractEquipment{
public:
Wujinzhiren(AbstractHero* hero):AbstractEquipment(hero){
}
//增加额外功能
void AddWujinzhiren(){
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(){
AddWujinzhiren();
cout<<"血量:"<< mHp << endl;
cout<<"魔法:"<< mMp << endl;
cout<<"攻击:"<< mAt << endl;
cout<<"防御:"<< mDf << endl;
}
};
void test01()
{
AbstractHero* hero = new HeroA;
hero->ShowStatus();
cout<<"--------------"<<endl;
//给裸奔的英雄穿上衣服
hero = new KuangTuEquipment(hero);
hero->ShowStatus();
cout<<"--------------"<<endl;
//给英雄装备武器
hero = new Wujinzhiren(hero);
hero->ShowStatus();
delete hero;
hero = NULL;
}
int main(void)
{
test01();
system("pause");
return 0;
}
因为英雄穿上衣服之后还是英雄,所以穿衣服的英雄就应该有裸奔英雄的行为ShowStatus()。
所以抽象装备继承于抽象英雄。
class AbstractEquipment : public AbstractHero{};