本文是 《Qt 框架性开发实践——基础框架篇》的第二篇。
本文所讲的内容已经开源,你可以在 这里 找到源代码。
消息总线是一种常见的架构模式,它通过隔离生产者、消费者达到解除或者弱化耦合的目的。生产者通过发布消息来展示自己的存在感,消费者通过订阅消息来满足自己的需求。消息总线管理消息,有目标的分发。
因为比较常用,并且实现简单,在 C++ 语言中也不乏各种消息总线的实现。但是在 Qt 中,利用 Qt 特性来实现消息总线的很少见。
然而,Qt 的很多特性,能够在消息总线中被应用,比如“信号-槽”本身也是一种发布、订阅的模式,而且还能够执行跨线程分发。另外利用 Qt 的元数据类型系统,可以实现强、弱消息类型的转换,从而让脚本语言(比如 webjs)也能够通过桥接(Hybrid Bridge)实现消息的发布、订阅。
下图是总线消息的基本结构: 在某些情形下,消费者需要给发布者反馈一些消息。一个常用的场景是,订阅者需要拦截发布者继续执行后续动作。
我们把这种反馈设计为异步的,所以利用了 QtPromise 工具。这是一个第三方 github 开源工具,但是因为比较基础,我们也将用专门的章节,概述一下其基本的设计思路,以及与 Qt 相关的实现细节。
接下来分三个章节讨论: