首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态机设计

状态机设计
EN

Stack Overflow用户
提问于 2014-08-26 21:20:18
回答 1查看 476关注 0票数 1

我正在使用c++中的协议设计代码,需要有关状态机设计的帮助。

我们拥有的所有状态机都具有相同的性质。每个状态机都有特定的状态(S1、S2等),每个状态只能接受特定类型的事件(E1、E2等)。基于事件处理的结果,机器移动到下一个状态。

例如,从状态S1和事件E1,机器可以移动到S2或S3。我研究了states模式,但是它建议所有的状态(派生的状态类)都应该实现状态机可以执行的所有动作,或者基态类应该实现这样的操作。在我的例子中,单个状态只能处理某些事件,所以我认为状态设计模式将不适用。

你能建议怎样才能最好地实现这样的机器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-26 21:57:41

根据“四人帮”,当对象的行为取决于其状态时,状态设计模式是适用的,并且它必须在运行时根据状态改变行为。

状态机的描述(它根据事件更改状态)似乎与此描述相匹配。

代码语言:javascript
复制
class StateMachine {    // state machine that processes events received
    State *s; 
public:  
    StateMachine();         // constructor: here you shall set initial state
    void process (Event* e); // processes the event and sets the next state
    bool isReady ();        // example of other requests
};

这种模式的原理是有一个抽象基类,定义StateMachine可能委托给一个状态的所有潜在状态依赖的“动作”。

代码语言:javascript
复制
class State {
public: 
      virtual void process (StateMachine *m, Event* e)=0;    // called by state machine /  pure virtual MUST be implemented in concrete state 
      virtual bool isReady(StateMachine *m);  // example  
      ...                               // other "actions"     
};

然后,可以很容易地定义状态和状态机之间的接口。例如:

代码语言:javascript
复制
void StateMachine::Process (Event *e) {
     s->Process (this, e);   // calls the Process() of the current state 
}

导出的具体状态随后将实施不同的行为。由于此*模式适用于C++中的虚拟函数,因此必须为每个具体状态(无论是基类还是派生状态)定义所有操作。这是定义虚拟函数的直接结果。

但是对于与所有状态无关的操作,您可能有一个默认操作,要么什么也不做,或者触发错误(错误消息、异常、.)。这取决于你的总体设计,你是否防止这种情况发生。

例如:

代码语言:javascript
复制
bool State::isReady(StateMachine *m) {  // if this request is only relevant for a couple of states
   throw std::exception ("unauthorized request");   // trigger an exception if it happens
   return false;
}    // this is done by default, except for concrete state that defines somtehing else 

根据你的描述,我真的很喜欢国家模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25515317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档