C++设计模式之装饰模式

装饰模式:包装模式,通过一种对客户端透明的方式来扩展对象功能,是继承关系的一种替代。装饰模式就是把要附加的功能分别放在单独的类中,并让这个类包含他要装饰的对象,当需要执行时,客户端就可以有选择的,按顺序的使用装饰模式功能包装对象

//一般情况下,可以用继承对类进行拓展
//装饰模式 可以动态给一个类增加功能
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
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值