c++ - 跨依赖类的状态一致性

标签 c++ state

假设有两个类 FooBarBar 取决于 Foo 提供的一些状态。这些类可能具有如下结构:

class Foo
{
public:
  // Constructors and destructors

  const State& get_state() const;

  /* Invalidates and recreates the 'State' object passed by 'get_state' */
  void handle_event();

private:
  // private member variables
};

class Bar
{
public:
  Bar(const Foo& foo);

private:
  const State& m_state; //Assigned via foo.get_state()
};

假设除了将 FooBar 组合成一个类之外,还必须以这种方式传递 State。此外假设可以有多个使用 Foo 中的 StateBar 类。

handle_event 成员函数被调用时,处理这种情况的模式或“标准”方式是什么,使得 Bar 始终处于有效状态?

我可以想象像 Bar 这样的东西在构造过程中将自己注册到 Foo 可以提供这样的机制。下面是一个例子。这个问题是我觉得它可能耦合得太紧了。

class Foo
{
public:
  void register_dependency(Bar* bar);
  void deregister_dependency(Bar* bar);

private:
  std::set<Bar *> m_dependencies;
};

class Bar
{
public:
  void invalidate_state(const Foo& foo);
};

最佳答案

我会选择像您提议的那样的系统。它是行之有效的版本observer图案。

如果您认为 Bar 之外的其他类型可能需要来自 Foo 的状态,那么您可以使用接口(interface)来解耦。

class Foo;
class IFooStateObserver {
public:
    virtual ~IFooStateObserver() {}
    virtual void invalidate_state(const Foo& foo) = 0;
};

class Foo {
public:
    void register_dependency(IFooStateObserver* observer);
    void deregister_dependency(IFooStateObserver* observer);

private:
    std::set<IFooStateObserver*> m_dependencies;
};

class Bar : public IFooStateObserver {
public:
    void invalidate_state(const Foo& foo) override;
};

如有必要,类似的系统可以将 FooBar 隔离。

关于c++ - 跨依赖类的状态一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49712699/

相关文章:

android - 保存游戏状态安卓

c++ - 在多个函数中使用时 va_list 的意外行为

c++ - 判断 std::vector 是否已重新放置其数组的最佳方法是什么?

c++ - 在结构体中打印数组

C++如何从包含的类中调用父类方法?

javascript - 设置状态后设置状态

c++ - 在 Rcpp 中控制编译顺序

javascript - ReactJS - 如何更新嵌套和 "normal"状态属性?

dart - 如何在 StatelessWidget 中更改 StatefulWidget 的状态?

haskell - 在 Haskell 中编写有状态函数