C++ 公共组件-对象消息总线库

C++ 公共组件-对象消息总线库

消息总线介绍

对象之间的关系一般有:依赖、关联、聚合、组合和继承,耦合关系也是依次加强的。对象间比较常见的关联关系是依赖、引用和继承。在大规模的软件开发过程中,对象很多,关联关系也非常复杂,如果没有一种统一、简洁的方法去管理这些对象的关系,很可能会导致对象的关系像蜘蛛网一样,导致后面维护的困难。对象间直接依赖或引用会导致依赖、引用关系复杂化;接口依赖是一种强耦合关系,不满足低耦合要求。因此,需要一种技术解决对象间关系过于复杂、耦合性较强的问题。

基于消息总线技术可以有效地解决这些问题,对象间只通过消息联系,而不是通过直接依赖或者关联。消息总线将复杂的对象关系简化了,降低了复杂度,也使我们从处理复杂的对象关系网之中解放出来,提高了程序的可维护性。

在消息总线中,对象都是通过消息来联系的,消息即对象的关系,我们只需要在消息总线中管理这些消息,而不用关心具体哪些对象之间有关联,这样便于统一管理。由于对象之间只是依赖于某种消息,没有直接的依赖关系,也不需要继承,对象间的耦合也消除了,两个对象之间可以没有任何关系,大大降低了对象之间的耦合性。

消息总线关键技术

(1)通用的消息定义
消息总线技术的本质是让所有的对象都通过消息来联系,因此,需要定义一种通用的消息格式,让所有的对象都能接受。
(2)消息的注册
让所有对象都可以注册感兴趣的消息。
(3)消息分发
通过消息总线分发消息,让所有的接收者都能收到并处理消息

消息总线设计思想

消息总线时序图

在这里插入图片描述
从上图可以看出,Subject和Object对象并没有联系,它们都是通过消息总线发生联系的。下面介绍消息总线将消息发送到对应的观察者对象的步骤。
1)观察者向消息总线注册消息体,消息体为可调用对象加字符串类型的主题,注册的目的是为了能在合适的时候收到这种类型的消息。
2)消息总线保存观察者注册的消息体。
3)主题对象向消息总线发送消息,消息类型为可调用对象的返回类型加某个字符串主题。
4)消息总线根据主题对象发过来的消息类型来查找所有对该消息感兴趣的观察者。
5)消息总线向观察者广播消息。
6)观察者处理消息。

消息总线类图

在这里插入图片描述
从类图中可以看到,消息总线的实现比较简单。下面看一下类图中的几个对象。

  • NonCopyable:防止类被复制,需要从它派生。关于它的介绍,读者可以参考前面8.2节。
  • MessageBus:消息总线,负责维护系统中所有的消息,具备添加消息、分发消息和移除消息的功能。其中void Attach(F&&f,const string&strTopic="")方法是供观察者对象来注册消息的,默认的字符串类型的主题为空;void Remove(const string&strTopic="")方法是用来移除消息的;void SendReq(Args&&…args,const string&strTopic="")是供主题对象来发送消息的,默认的字符串类型的主题为空。
  • Observer:观察者对象,接收并处理消息总线发过来的消息。
  • Observer_Fcuntion:消息体,可调用对象,实际上是观察者对象内部的某个函数。
  • Subject:主题对象,向消息总线发送消息的对象。

消息总线实现

github项目地址

发布了155 篇原创文章 · 获赞 15 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/wangdamingll/article/details/105127569
今日推荐