设计模式笔记:状态模式 发表于 2024-03-17 | 分类于 设计模式 状态模式:当状态改变会改变行为时,将状态与行为封装到一个类中。 在状态发生改变时对应的处理方法也发生改变,允许一个对象在其内部改变时改变它的行为。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162//头文件#include <iostream>using namespace std;class Context;//声明//抽象出来的状态类class State{public: /*抽象的接口,每个子类去实现这个接口 根据自己的逻辑执行任务或者转换状态。 */ virtual void Handle(Context *context) = 0; //获得当前的状态 virtual void GetState() = 0;};//状态管理类class Context{public: //初始化状态 Context(State *state) { m_pState = state; } //获得当前的状态 State* GetState() { return m_pState; } //改变当前的状态 void SetState(State *state) { m_pState = state; } //执行状态类实现的方法 void Request() { m_pState->Handle(this); } State* m_pState;};//具体的状态子类class ConcreteStateA:public State{public: void Handle(Context *context); void GetState();};//具体的状态子类class ConcreteStateB:public State{public: void Handle(Context *context); void GetState();};//具体的状态子类class ConcreteStateC:public State{public: void Handle(Context *context); void GetState();}; 1234567891011121314151617181920212223242526272829//cpp文件#include "StateMode.h"void ConcreteStateA:: Handle(Context *context){ context->m_pState = new ConcreteStateB; cout<<"当前状态是A,下一状态是B"<<endl;}void ConcreteStateB:: Handle(Context *context){ context->m_pState = new ConcreteStateC; cout<<"当前状态是B,下一状态是C"<<endl;}void ConcreteStateC:: Handle(Context *context){ context->m_pState = new ConcreteStateA; cout<<"当前状态是C,下一状态是A"<<endl;}void ConcreteStateA:: GetState(){ cout<<"当前状态是A"<<endl;}void ConcreteStateB:: GetState(){ cout<<"当前状态是B"<<endl;}void ConcreteStateC:: GetState(){ cout<<"当前状态是B"<<endl;} 123456789101112//main函数#include "StateMode.h"int main(void){ //初始化A状态 Context* context = new Context(new ConcreteStateA); context->Request(); context->Request(); context->Request(); getchar(); return 0;}