设计模式-状态模式

学习笔记:状态模式
模式简介

:属于行为型模式,类的行为是基于它的状态而改变的。

为什么用

:对象在不同的状态对于同一件事物有不同的行为,把这种不同抽象出来,就可以不写if-else语句了。

怎么样用

:把需要抽象的方法写成一个类,每个子类实现相应状态下的方法。这样通过申请不同的状态类,就可以实现不同的功能。

注意事项

:确保状态不会太多。

实际举例

:游戏宠物的状态变化。

#include <iostream>
#include <vector>
using namespace std;
//宠物
class Pet {
private:
    string name;
    enum class State {
        Fighting,
        Relaxing,
        Normal
    }state;
    string StateText[3] = { "战斗中","休息中","正常" };
public:
    //友元类方便使用私有成员
    friend class PetState_Fighting;
    friend class PetState_Relaxing;
    friend class PetState_Normal;
    Pet(string name) {
        this->name = name;
        this->state = State::Normal;
    }
    void showState() {
        cout << "当前状态: " << StateText[int(state)]<<"\n";
    }
};
class PetState {
public:
    virtual void toDo(Pet *pet) {
        cout << "待实现的方法\n";
    }
};
class PetState_Fighting :public PetState {
public:
    void toDo(Pet *pet) {
        pet->state = Pet::State::Fighting;
        cout <<"["<<pet->name<<"]"<< "开始战斗\n";
    }
};
class PetState_Relaxing :public PetState {
public:
    void toDo(Pet* pet) {
        pet->state = Pet::State::Relaxing;
        cout << "[" << pet->name << "]" << "开始休息\n";
    }
};
class PetState_Normal :public PetState {
public:
    void toDo(Pet* pet) {
        pet->state = Pet::State::Normal;
        cout << "[" << pet->name << "]" << "随时待命\n";
    }
};
int main(){
    //正常
    cout << "---init---\n";
    Pet* pet = new Pet("king");
    pet->showState();
    //战斗
    cout << "\n---fighting---\n";
    PetState_Fighting* pet_fight = new PetState_Fighting();
    pet_fight->toDo(pet);
    pet->showState();
    //休息
    cout << "\n---relaxing---\n";
    PetState_Relaxing* pet_relax = new PetState_Relaxing();
    pet_relax->toDo(pet);
    pet->showState();
    //回归正常
    cout << "\n---normal---\n";
    PetState_Normal* pet_normal = new PetState_Normal();
    pet_normal->toDo(pet);
    pet->showState();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值