状态机类对象的类设计思想

Posted

技术标签:

【中文标题】状态机类对象的类设计思想【英文标题】:Class design ideas for state machine like object 【发布时间】:2009-11-05 01:10:29 【问题描述】:

我正在编写一个类似对象的状态机。好像

Class A:

 vector<Actions> m_enter_actions;
 vector<Actions> m_exit_actions;

public:

  ClassA....
  ~ClassA

  SetEnterActions(vector<Actions> vector)
  SetExitActions(vector<Actions> vector)

这是处理此问题的最佳方法吗?我想知道我是否应该喜欢

Class A:
  EnterActions m_exit_actions;
  ExitActions m_exit_actions;

public:

  ClassA....
  ~ClassA

  SetEnterActions(EnterActions& actions)
  SetExitActions(ExitActions& actions)

EnterActions 类将是一个具有自己的动作向量的容器。这样 ClassA 类就不需要管理原始向量了。

感谢任何帮助。我在班级设计方面很糟糕。学习虽然:)

【问题讨论】:

【参考方案1】:

SetEnterActions 和 SetExitActions 函数的签名应设计为防止调用者知道 ClassA 如何存储操作。 ClassA 的用户不想知道 ClassA 是否将它们存储在向量、双端队列、列表、EnterActions 类或其他任何东西中。他们当然不希望将它们打包到 ClassA 存储它们的任何容器中。

我的第一个倾向是允许调用者提供一个迭代器,并允许调用者通过函数调用一次添加一个:

template <typename InputIterator>
AddEnterActions(InputIterator first, InputIterator last);

AddEnterAction(const Action &action);

因此,如果调用者将它们放在向量中,他将调用AddEnterActions(vec.begin(), vec.end());。如果他将它们放在一个数组中,他会调用AddEnterActions(arr, arr+size);。如果他有一些不寻常的方法来生成它们,他不必乱七八糟地将它们放入容器中然后一次全部添加,也不必编写迭代器类来生成它们。他可以在弄清楚它们是什么时添加它们。

同时,如果 ClassA 将动作存储在向量中,那么实现就是:

template <typename InputIterator>
AddEnterActions(InputIterator first, InputIterator last) 
    m_enter_actions.insert(m_enter_actions.end(), first, last);


AddEnterAction(const Action &action) 
    m_enter_actions.push_back(action);

如果 ClassA 以后想将它们存储在其他东西中,那么您无需更改任何客户端代码。

在可能的情况下,首先根据调用者的需求设计接口。然后担心执行。当你发现它无法实现或者它要求类做一些非常低效的事情时,你有时不得不返回并调整接口。但通常不会。

【讨论】:

【参考方案2】:

如果您认为需要它们来展示超出法线向量的行为,请使用 EnterActions 和 ExitActions。否则,向量很好,imo。

【讨论】:

以上是关于状态机类对象的类设计思想的主要内容,如果未能解决你的问题,请参考以下文章

用JAVA设计,实现并测试一个计算机类,它包括如下内容

设计线程安全的类--对象的组合

设计模式-状态模式

设计模式之状态模式

状态模式——HeadFirst设计模式学习笔记

Head First 设计模式-状态模式