Согласованность состояния между зависимыми классами

avatar
Alex
7 апреля 2018 в 22:45
24
1
0

Предположим, что есть два класса Foo и Bar, где Bar зависит от некоторого состояния, предоставляемого 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()
};

Предполагая, что помимо объединения обоих классов Foo и Bar в один класс, необходимо передать State таким образом. Кроме того, предположим, что может быть несколько классов Bar, использующих State из Foo.

.

Когда вызывается функция-член 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);
};
Источник

Ответы (1)

avatar
Jack C.
7 апреля 2018 в 23:09
1

Я бы предпочел систему, подобную той, которую вы предложили. Это версия хорошо зарекомендовавшего себя шаблона observer.

Если вы считаете, что другим типам, кроме Bar, может потребоваться состояние из Foo, то вы можете использовать интерфейс для разделения.

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;
};

Аналогичная система может при необходимости изолировать Foo от Bar.