我必须用公共接口(API)实现一些逻辑。
int api_open();
int api_1(int a, int b);
int api_2(int x, int y);
...
每个 API 调用的返回值和“含义”取决于某些状态。规则示例:如果您在成功调用 api_open() 之前进行了任何 api 调用,则应返回错误。我在这里看到两种状态:初始状态和打开状态。在初始状态下,所有 api 调用都应该返回错误,除了 api_open()。在打开状态 api_1() 和 api_2() 执行一些操作。
通常我会将其实现为具有公共接口和以具体类型实现的状态的状态模式。示例:https ://www.robertlarsononline.com/2017/05/11/state-pattern-using-cplusplus/
然后我想..如果每个 boost.msm 状态都是这样的
//opened state
struct opened : public msm::front::state<api_impl> {
virtual int api_open(){}
virtual int api_1(int a, int b){}
virtual int api_2(int x, int y){}
};
...
typedef msm::back::state_machine<api_> api_fsm;
然后我需要做的就是从状态机访问当前状态......并调用 api 方法。
api_impl* impl = api_fsm.get_state_by_id(*api_fsm.current_state());
但是引用 fom doc: current_state 返回当前活动状态的 id。您通常仅将它用于调试或记录目的。
感觉就像我试图滥用 boost.msm 库......我想我正在尝试将经典的 oop 状态模式与 msm 混合。情况不妙....
可能我应该将每个 API 调用作为事件(带有数据,表示 API 调用参数)传递给状态机,并以某种方式从中获取返回值......如何?
感觉就像将数据发送到状态机并取回并不明显。或者我可能没有明白这一点?
所以主要问题是:用 boost.msm 解决我的问题的正确方法是什么?