我正在使用c++中的协议(protocol)设计代码,需要有关状态机设计的帮助。
我们拥有的所有状态机都具有相同的性质。每个状态机都有某些状态(S1,S2等),每个状态只能接受某些类型的事件(E1,E2等)。根据事件处理的结果,机器将移至下一个状态。
例如,从状态S1开始,对于事件E1,机器可以移至S2或S3。我研究了状态设计模式,但是它建议所有状态(派生的状态类)应执行状态机可以执行的所有操作,或者基本状态类应执行此类操作。就我而言,个别国家只能处理某些事件,因此我认为国家设计模式将不适用。
您能建议什么是实现此类机器的最佳方法/模式。
最佳答案
根据“四人组”的规定,当对象的行为取决于其状态并且必须在运行时根据该状态更改行为时,可以使用State设计模式。
根据事件更改状态的状态机描述似乎与此描述匹配。
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可以委派给一个状态的所有与状态有关的“ Action ”。
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"
};
状态和状态机之间的接口(interface)将易于定义。例如:
void StateMachine::Process (Event *e) {
s->Process (this, e); // calls the Process() of the current state
}
然后,派生的具体状态应执行不同的行为。由于此 *模式可与C++ 中的虚函数一起使用,因此必须为每种具体状态(在基类或派生状态中)定义所有 Action 。这是定义虚拟功能的直接结果。
但是对于与所有状态都不相关的操作,您可能具有默认操作,要么不执行任何操作,要么触发错误(错误消息,异常等)。是否要防止这种情况的发生取决于您的总体设计。
例如:
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
根据您的描述,我真的会选择状态模式。
关于c++ - 状态机设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25515317/