设计模式学习(C++实现)14——状态模式

概述

状态模式就是日常经常使用的状态机,例如线程存在睡眠、运行、停止、僵死等各种状态,在不同状态时线程对于不同的输入有不同的响应,外部也可以根据线程的状态作不同的操作;同样的,在机器人体系中,也经常使用状态机,表示机器人的不同状态,以实现不同状态下的不同响应。

代码实现

///前置声明
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();
}

以上实现了一个简单的状态机,状态切换没有什么逻辑,但状态机的基本实现就是这样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值