国家机器设计

时间:2014-08-26 21:20:18

标签: c++ design-patterns state-machine

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

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

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

您能否建议实施此类机器的最佳方法/模式。

1 个答案:

答案 0 :(得分:1)

根据"四人组#34;当 对象的行为取决于其状态并且它必须在运行时改变行为时,状态设计模式是适用的,取决于该州。

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

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可以委托给一个州。

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"     
};

您的州和州机器之间的接口将很容易定义。例如:

void StateMachine::Process (Event *e) {
     s->Process (this, e);   // calls the Process() of the current state 
}

然后,派生的具体状态应实现不同的行为。由于此 *模式适用于C ++中的虚函数,因此必须为每个具体状态(在基类或派生中)定义所有操作。这是定义虚函数的直接结果。

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

例如:

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 

根据你的描述,我真的会选择状态模式。