状态模式(State)
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
以下为电梯的上下运动的例子:
//State.h class Elevator; //状态基类 class State { public: State() {} virtual void Move(Elevator *elevator); //电梯运动 }; //电梯类 class Elevator { private: State *state; public: Elevator(State *state); void SetState(State *state); //设置电梯状态 void Request(); //电梯状态改变的请求 }; //电梯向上状态 class UpState: public State { public: UpState() {} virtual void Move(Elevator *elevator); //电梯向上运动 }; //电梯向下状态 class DownState: public State { public: DownState() {} virtual void Move(Elevator *elevator); //电梯向下运动 };
//State.cpp #include "State.h" #include <iostream> using namespace std; Elevator::Elevator(State *state) { this->state = state; } void Elevator::SetState(State *state) { this->state = state; } void Elevator::Request() { state->Move(this); } void State::Move(Elevator *elevator) { cout << "State Move" << endl; } void UpState::Move(Elevator *elevator) { cout << "UpState Move" << endl; State *state = new DownState(); elevator->SetState(state); } void DownState::Move(Elevator *elevator) { cout << "DownState Move" << endl; State *state = new UpState(); elevator->SetState(state); } int main() { State *state = new UpState(); Elevator elevator(state); elevator.Request(); elevator.Request(); elevator.Request(); elevator.Request(); return 0; }
状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割来来。
状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,可以考虑使用状态模式。