装饰模式

来源:互联网 发布:星际争霸2和lol知乎 编辑:程序博客网 时间:2024/06/05 08:47

装饰模式

装饰模式又叫包装模式,通过一种对客户端透明的方式来扩展对象功能,是继承关系的一种替代。

装饰模式就是把要附加的功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择的、按顺序的使用装饰功能包装对象。

比如:给小人穿衣服。可以穿背心,裤衩,裤兜子等。如果使用继承,小人需要继承背心,继承裤衩,继承裤兜子,这样继承关系复杂,代码维护起来不方便。


#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{};







原创粉丝点击