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

时间:2009-11-05 01:10:30

标签: c++ design-patterns class

我正在写一个像对象一样的状态机。看起来像

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类不需要管理原始向量。

感谢任何帮助。我在课堂设计上非常糟糕。学习虽然:)

2 个答案:

答案 0 :(得分:1)

SetEnterActions和SetExitActions函数的签名应设计为防止调用者知道ClassA如何存储Actions。 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以后想要将它们存储在其他内容中,那么您不需要更改任何客户端代码。

在可能的情况下,首先根据呼叫者的需求设计界面。然后担心实施。当你发现它不可实现或者它要求该类执行非常低效的操作时,你有时必须返回并调整界面。但通常不会。

答案 1 :(得分:0)

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