微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 在分离的设计层之间有效地传递通知

我正在升级数据与UI轻微耦合的设计:

class Object {
    UI * ui;
};


class UI {
    Object * object;
};

通过UI指针将更新通知推送到ui是相当简单的,但是数据的新要求完全与UI分离,并且对于不同的对象也有多个不同的UI表示,因此单个UI指针不再是它,也不是允许成为数据层的一部分.

由于高对象数(在数亿的范围内)并且QObject比层次结构中的最大对象大几倍,因此由于其开销而不能使用类似QObject和信号的东西.对于UI部分来说,这并不重要,因为一次只能看到一部分对象.

我实现了一个UI注册表,它使用multihash来存储所有UI,使用Object *作为键,以便能够获取给定对象的UI并发送通知,但查找和注册和注销考虑到高对象数,UI会带来很大的开销.

所以我想知道是否有一些设计模式可以在解耦层之间发送通知而且开销更少?

澄清:大多数更改都在UI端完成,UI元素保留指向相关对象的指针,因此这不是问题.但是,对UI侧的某些对象进行的某些更改会导致数据层中相关对象中发生的更改,这些更改无法预测,以便请求更新受影响对象的UI.实际上,对一个对象进行的UI上的单个更改可能会导致对其他对象的一系列更改,因此我需要能够通知其最终的UI表示以进行更新以反映这些更改.

解决方法

一种用于解耦通信的通用机制是 publish-subscribe pattern.在这种情况下,更新的对象会将通知发布到消息队列,然后消息队列负责通知注册该队列的UI组件有兴趣接受该特定通知类别.

原则上,这与您已尝试过的UI注册表类似.主要区别在于,要更新的UI组件不是完全由其引用的对象标识,而是由通知类型标识.

这允许在特异性和状态保持之间进行权衡:如果建立模型使得与对象obj相关联的每个UI组件通过obj的每次更新得到通知,则它等同于UI注册表.另一方面,可以安排模型,使得每当对象的某个子类别发布更新时通知某些UI组件,然后每个组件可以检查自己是否需要基于该内容修改其状态.通知.极端情况下,任何Object发布的任何消息都可以通知每个UI对象,这相当于全局的“更新-UI-状态”方法.

发布 – 订阅模型包含这两个极端,但也包括介于两者之间的范围,您可以在其中找到合适的折衷方案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐