设计模式-装饰模式

行为型-装饰模式

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

#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 WujinzhiKnife : public AbstractEquipment{
public:
    WujinzhiKnife(AbstractHero* hero) : AbstractEquipment(hero){}
    //增加额外功能
    void AddWujinzhiKnife(){
        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(){
        AddWujinzhiKnife();
        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 WujinzhiKnife(hero);
    hero->ShowStatus();
}

int main()
{
    test01();

    system("pause");
    return 0;
}

posted @ 2023-10-14 19:36  洋綮  阅读(4)  评论(0)    收藏  举报