简介
观察者模式和发布订阅者模式是两种常用的软件设计模式,它们均能提高软件系统的可维护性、灵活性和扩展性。 然而,它们之间也存在一些区别,本文将对两者进行比较,从多个角度探讨它们的异同点。
基本定义
观察者模式是对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 它包含Subject(被观察者)和Observer(观察者)两个基本角色,其中Subject需要维护一个观察者的列表,并提供方法用于添加或删除观察者。 当Subject的状态发生变化时,它会通知所有观察者进行更新。
发布订阅者模式是在观察者模式的基础上进一步扩展的,它将观察者分为发布者和订阅者两类,发布者可以发布消息到频道,订阅者可以订阅特定的频道并接收到该频道的所有消息。 发布订阅者模式需要引入一个消息中心(Message Broker)作为中央代理人,它负责维护所有频道和订阅者的关系,当发布者发布消息后,消息中心会将消息广播到所有订阅者。
观察者模式和发布订阅者模式的比较
1. 解耦性
观察者模式是基于直接的依赖关系,观察者需要直接持有被观察者的引用,如图所示:

而发布订阅者模式则是基于间接的依赖关系,消息中心充当了一个中央代理人,发布者和订阅者不需要直接持有彼此的引用,如图所示:

由于发布订阅者模式引入了消息中心,可以消除发布者和订阅者之间的直接依赖关系,增强了组件之间的解耦性,有利于系统的灵活性和扩展性。
2. 粒度
观察者模式的粒度较粗,只能基于对象级别进行观察,当某个对象状态发生改变时,所有注册的观察者都会被通知。 而发布订阅者模式的粒度较细,可以基于消息级别进行发布和订阅,不同的订阅者可以订阅不同的消息频道,只接收自己感兴趣的消息。
3. 可扩展性
观察者模式可以通过添加或删除观察者的方式进行扩展,当有新的观察者需要注册时,只需要将其添加到被观察者的观察者列表中即可。 而发布订阅者模式可以通过添加或删除消息频道,以及订阅或取消订阅消息来进行扩展,可以实现更细粒度的消息过滤和发送。
4. 线程安全性
在观察者模式中,当多个观察者同时响应被观察者的状态变化时,可能会发生竞态条件导致结果不一致或异常情况。 针对这种情况,可以采用同步手段(如锁或信号量)来保证线程安全性。 而在发布订阅者模式中,由于消息中心扮演了中央代理人的角色,所有消息的发布和订阅都集中在消息中心,可以通过线程安全的方式来实现。
结论
虽然观察者模式和发布订阅者模式都可以实现对象间的消息传递,但它们的设计思想和应用场景有所差异。 观察者模式主要适用于对象级别的消息通信,可以用于事件处理、UI界面更新等场景。 而发布订阅者模式则适用于消息级别的通信,可以用于系统解耦、分布式通信等场景。 在具体应用中,需要根据实际情况选择合适的模式,避免使用不当导致的系统不稳定或低效。
扫码咨询 领取资料