我正在升级数据与 UI 轻微耦合的设计:
class Object {
UI * ui;
};
class UI {
Object * object;
};
通过 UI 指针向 UI 推送更新通知相当简单,但新的要求是数据与 UI 完全分离,并且不同对象具有多个不同的 UI 表示,因此单个 UI 指针不再适用它也不允许成为数据层的一部分。
不可能使用像 QObject
和信号这样的东西,因为它的开销很大,因为对象计数很高(在数亿范围内)并且 QObject
是比层次结构中最大的对象大几倍。对于 UI 部分,这无关紧要,因为一次只能看到一部分对象。
我实现了一个 UI 注册表,它使用多重哈希来存储所有使用 Object *
作为键的 UI,以便能够获取给定对象的 UI 并发送通知,但鉴于对象数量较多,UI 的查找以及注册和注销会带来巨大的开销。
所以我想知道是否有某种设计模式可以以更少的开销在解耦层之间发送通知?
澄清:大部分更改是在 UI 端完成的,UI 元素保留指向相关对象的指针,因此这不是问题。但是,从 UI 端对某些对象所做的一些更改会导致数据层中相关对象发生更改,而这些更改无法预测,无法请求更新受影响对象的 UI。事实上,对一个对象的 UI 进行的单一更改可能会导致对其他对象的一系列更改,因此我需要能够通知它们最终的 UI 表示进行更新以反射(reflect)这些更改。
最佳答案
解耦通信的一种通用机制是 publish-subscribe pattern .在这种情况下,更新的对象会向消息队列发布通知,然后消息队列负责通知已向队列注册的 UI 组件有兴趣接受该特定类别的通知。
这在原则上类似于您已经尝试过的 UI 注册表。主要区别在于,要更新的 UI 组件不完全由其引用的 Object
标识,而是由通知类型标识。
这允许在特异性和状态保持之间进行权衡:如果模型的设置使得与 Object
obj
关联的每个 UI 组件都会在每次更新时得到通知obj
,则相当于UI注册表。另一方面,该模型可以安排为当 Object
的某个子类别发布更新时通知某些 UI 组件,然后每个组件可以自行检查是否需要修改其自身基于通知内容的状态。在极端情况下,每个 UI 对象都可以通过任何 Object
发布的任何消息来通知,这相当于全局“更新 UI 状态”方法。
发布-订阅模型既包含这两个极端,也包含介于两者之间的范围,您可以在其中找到合适的折衷方案。
关于c++ - 在分离的设计层之间高效地传递通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890308/