解决重复的对象更改通知

时间:2014-10-30 05:08:49

标签: c++ qt notifications

以下问题对我来说很难找到一个简洁的解决方案。

假设我在C ++伪代码中有以下对象:

// Class A simply holds a collection of properties.
class A
{
    // Some properties
};

// Class B could hold a bounded number of A& references.
// The referenced A objects are not owned by B.
class B
{
    A& m_a0;
    A& m_a1;

    // Some other properties
};

// Class C could hold an unbounded number of A& references.
// The referenced A objects are not owned by C.
class C
{
    List<A&> m_aList;

    // Some other properties
};

// Class D holds lists of objects.
// The objects are owned by D.
// The A references held by objects of type B or C
// refer to instances of A objects that class D owns
// (ie. entries in m_aList).
class D
{
    List<A> m_aList;
    List<B> m_bList;
    List<C> m_cList;

    // Some other properties
};

每个对象都能够发送某些事件的通知;在我的使用环境中,这是其他对象可以响应的Qt C ++“信号”。以下属性包含:

  • 对象在更改任何属性时会发出更改通知。
  • B 对象如果从其引用的 A 对象中收到一个,或者其他任何属性发生更改,则会发出更改通知。
  • C 对象如果从任何引用的 A 对象中收到一个,或者其他任何属性发生更改,则会发出更改通知。
  • D 对象如果从m_bList或m_cList中的任何对象接收到更改通知,或者其他任何属性发生更改,则会发出更改通知。

存在以下设置时出现问题:

  • D 的实例,“ d0 ”包含一些 A B C 对象。
  • 存在 B 对象“ b0 ”和 C 对象“ c0 ”,以便他们拥有至少有一个 A&amp; ,“ a0 ”,共同点。
  • a0 上的属性已更改; a0 会发送更改通知。
  • 由于 a0 b0 c0 的引用组件, b0 c0 < / strong>都发送更改通知。
  • d0 会收到这两个连续的通知,因此会发送两个自己的更改通知,即使 d0 的状态只有一个整体更改。< / LI>

因为实际上我正在对来自 D 对象的更改通知进行操作,以便在3D中重建其可视化表示,响应 D 更改通知的成本很高,因此在申请的上下文中,上述情况既不准确又效率低下。

我认为以下方法不可行:

  • 通过 D 中的mutator方法限制对 A 对象的所有访问,以便在 A 对象上的属性发生更改时然后mutator方法只发送一次 D 对象通知。这是不可行的,因为传递对 A 对象的引用可能很有用,并且当外部修改 A 引用时, D 仍应发送更改通知。对于 A 中的每个属性,此方法可能还需要单独的mutator方法,这将是一个难以维护的噩梦。

  • 仅在收到 A 通知时发送 D 更改通知,并忽略来自 B C <的通知/ em>对象。这是不可行的,因为 B C 对象可能具有其他内部属性,这些属性会导致更改通知被触发,在这种情况下 D 仍然需要发送自己的通知作为回应。

这个问题是否有可扩展的解决方案?我想实现这样的行为:对于属于 D 的组件的单个属性的每个单独更改, D 将触发一个更改通知。

0 个答案:

没有答案