首页 > 数据库 > 数据库开发技术 > 分布式软总线连接模块中观察者模式原理设计分析
观察者模式(Observer Pattern)是分布式软总线连接模块的核心架构模式,它定义了一种一对多的依赖关系:当一个对象(被观察者/Subject)的状态发生改变时,所有依赖于它的对象(观察者/Observer)都会收到通知并自动更新。
在连接模块中,连接管理器(ConnManager)是被观察者,各业务模块(认证、通道、代理等)是观察者。这种设计使得连接状态的变化能够自动、透明地传播给所有关心的业务方,实现了松耦合的事件驱动架构。

观察者模式属于行为型设计模式,其经典结构包含四个角色:
| 角色 | 英文 | 职责 |
|---|---|---|
| 主题接口 | Subject | 定义注册、删除、通知观察者的方法 |
| 具体主题 | ConcreteSubject | 维护观察者列表,状态变化时通知 |
| 观察者接口 | Observer | 定义接收通知的更新方法 |
| 具体观察者 | ConcreteObserver | 实现具体的响应逻辑 |

| 方式 | 特点 | 适用场景 |
|---|---|---|
| Push推送 | 被动接收,Subject主动传递数据 | 数据确定且需要立即处理 |
| Pull拉取 | 主动获取,Observer按需查询 | 数据量大或需要选择性获取 |
这是观察者接口的定义,每个业务模块必须实现这四个回调函数来响应连接事件。
每个节点代表一个已注册的业务观察者:
moduleId — 唯一标识该观察者(如 MODULE_AUTH_CHANNEL、MODULE_PROXY_CHANNEL)callback — 该观察者提供的四个事件处理函数关键设计点:
连接管理器实现了四种不同粒度的事件通知:
场景:连接建立或断开时,所有业务模块都需要知道
特点:
场景:数据到达时,只有发送数据的源模块应该收到
特点:
moduleId 定位唯一目标观察者ConnPktHead),只传递有效载荷场景:连接复用时,部分模块可能不关心此事件
特点:
架构意义:

没有观察者模式时的问题:
使用观察者模式后:
✅ 将 N×M 的网状依赖简化为 N+M 的星形依赖
分布式软总线的多个子系统需要实时感知连接状态变化:
如果采用轮询方式,会导致:
观察者模式实现即时推送,完美解决此问题。
耦合程度对比:
| 维度 | 直接调用 | 观察者模式 |
|---|---|---|
| 编译期依赖 | 强(需include头文件) | 弱(只需函数指针) |
| 运行期依赖 | 硬编码 | 动态绑定 |
| 修改影响范围 | 大(改一处可能影响多处) | 小(新增观察者无需改动被观察者) |
开放:对扩展开放 — 新增业务模块只需:
封闭:对修改封闭 — 新增观察者不需要修改连接管理器的任何代码!
各组件职责清晰分离:
| 组件 | 职责 |
|---|---|
| BR/BLE/TCP模块 | 只负责底层连接的建立、维护、断开 |
| 连接管理器 | 只负责事件收集和分发 |
| 业务模块 | 只负责自身业务逻辑 |
观察者可以在运行时动态注册和注销:
| 开销项 | 影响 | 缓解措施 |
|---|---|---|
| 函数指针间接调用 | 微小延迟 | C语言函数指针开销极小 |
| 链表遍历查找 | O(n)时间复杂度 | 观察者数量有限(<20),可忽略 |
| 内存拷贝快照 | 少量内存分配 | 快照只在事件发生时创建 |
| 互斥锁竞争 | 可能阻塞 | 锁持有时间极短(微秒级) |
结论:对于连接事件的频率(秒级),这些开销完全可接受。
问题:间接调用导致调用栈不够直观
缓解措施:
CONN_LOGI)问题:动态分配的观察者节点需要正确释放
缓解措施:
ConnServerDeinit() 时清理所有观察者DelListener() 时释放单个节点SoftBusFree() 统一内存管理连接模块实际上融合了多种设计模式:

原因:
原因:
list_head 结构原因:
分布式软总线连接模块的观察者模式设计体现了以下架构哲学:
| 设计维度 | 体现 |
|---|---|
| 关注点分离 | 连接管理与业务逻辑彻底解耦 |
| 可扩展性 | 新增连接类型/业务模块无需修改现有代码 |
| 可维护性 | 各模块独立开发、测试、部署 |
| 健壮性 | 线程安全的注册/注销/通知机制 |
| 性能平衡 | 在灵活性和效率之间取得最优平衡 |

这种设计使得分布式软总线能够在异构网络环境(WiFi/蓝牙/P2P)下,为多样化业务场景(认证/通道/代理/同步)提供稳定可靠的连接基础设施,真正做到了**"一次连接,处处感知"**的架构愿景。
原文作者:六bring个六;如有侵权,请联系管理员删除。