我正在使用c ++中的协议设计代码,需要有关状态机设计的帮助。
我们拥有的所有状态机都具有相同的性质。每个状态机具有某些状态(S1,S2等),并且每个状态只能接受某些类型的事件(E1,E2等)。根据事件处理结果,机器移动到下一个状态。
例如,从状态S1和事件E1,机器可以移动到S2或S3。我研究了状态设计模式,但它建议所有状态(派生状态类)应该实现状态机可以执行的所有操作,或者基本状态类应该实现这样的操作。在我看来,个别国家只能处理某些事件,所以我认为国家设计模式不适用。
您能否建议实施此类机器的最佳方法/模式。
答案 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
根据你的描述,我真的会选择状态模式。