概述
状态模式就是日常经常使用的状态机,例如线程存在睡眠、运行、停止、僵死等各种状态,在不同状态时线程对于不同的输入有不同的响应,外部也可以根据线程的状态作不同的操作;同样的,在机器人体系中,也经常使用状态机,表示机器人的不同状态,以实现不同状态下的不同响应。
代码实现
///前置声明
class State;
class Context{
public:
Context();
void SetState(State* state);
std::string GetState();
void Handle();
private:
State *state_;
};
///抽线状态类
class State {
public:
State(Context *context, const std::string &name)
: context_(context), name_(name){};
virtual ~State() = default;
std::string GetStateName() { return name_; }
virtual void Handle() = 0;
protected:
Context *context_;
std::string name_;
};
///初始状态
class OpenState : public State {
public:
explicit OpenState(Context *context) : State(context, "open_state") {}
void Handle() override;
};
///状态1
class StateType1 : public State {
public:
explicit StateType1(Context *context) : State(context, "state_type1") {}
void Handle() override;
};
///状态2
class StateType2 : public State {
public:
explicit StateType2(Context *context) : State(context, "state_type2") {}
void Handle() override;
};
///结束状态
class EndState : public State {
public:
explicit EndState(Context *context) : State(context, "end_state") {}
void Handle() override;
};
///以下为函数具体实现
void OpenState::Handle() {
std::cout << "Handle in " << name_ << std::endl;
context_->SetState(new StateType1(context_));
}
void StateType1::Handle() {
std::cout << "Handle in " << name_ << std::endl;
context_->SetState(new StateType2(context_));
}
void StateType2::Handle() {
std::cout << "Handle in " << name_ << std::endl;
context_->SetState(new EndState(context_));
}
void EndState::Handle() {
std::cout << "Handle in " << name_ << std::endl;
}
Context::Context() {
state_ = new OpenState(this);
}
std::string Context::GetState() {
return state_->GetStateName();
}
void Context::SetState(State *state) {
if(state_->GetStateName() == state->GetStateName()) return;
delete state_;
state_ = state;
}
void Context::Handle() {
state_->Handle();
}
int main(){
Context context;
context.Handle();
context.Handle();
context.Handle();
context.Handle();
}
以上实现了一个简单的状态机,状态切换没有什么逻辑,但状态机的基本实现就是这样。