学习笔记:状态模式
模式简介
:属于行为型模式,类的行为是基于它的状态而改变的。
为什么用
:对象在不同的状态对于同一件事物有不同的行为,把这种不同抽象出来,就可以不写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;
}