基本概念
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己的状态。
适用场景
观察者模式适用于任何需要实现对象之间松耦合、动态关联时,特别是当一个对象的状态变化需要通知多个其他对象做出响应的场景。如事件驱动系统,GUI系统和MVC模式。
模式的特点
-
一对多的依赖关系:观察者模式定义了一种一对多的依赖关系,即一个主对象可以有多个观察者对象订阅它的状态变化。
-
松散耦合:主对象并不需要知道观察者对象的具体实现细节,只需要一个观察者对象列表,并在状态变化时通知它们即可,使系统更容易扩展和维护。
-
动态关联:观察者对象可以动态地注册和移除自己,以决定是否接收主题对象的通知。这使得观察者模式具有一定的灵活性和可扩展性。
实现:信号与槽
QT中的信号与槽机制就是观察者模式的一种实现,
connect(主对象, 信号, 观察者对象, 槽)
其有观察者模式的以下特征:
- 主对象:发出信号的对象。
- 观察者对象:提供槽函数的对象。
- 动态关联:connect函数为主对象添加了一个观察者;反之,disconnect函数删除了一个观察者。
- 一对多的依赖关系:一个信号可以连接多个槽,当信号产生时,所有观察者的槽函数都会被调用,观察者可以更新自己的状态。
- 松散耦合:发出信号的对象不需要知道槽函数的实现,甚至参数都可以不匹配。
实现:事件过滤器
QT中的事件过滤器也是观察者模式的一种实现,
观察者->installEventFilter(主对象)
其有观察者模式的以下特征:
- 主对象:被监视的对象,通常重写 eventFilter() 。
- 观察者对象:安装了事件过滤器(
installEventFilter()
)的对象。 - 动态关联:通过调用
installEventFilter()
函数为主对象添加一个观察者对象,调用removeEventFilter() 可以删除一个观察者对象。 - 一对多的依赖关系:一个事件过滤器可以同时监视多个主对象的事件,因此实现了一对多的依赖关系。
- 松散耦合:被监视的对象不需要知道事件过滤器的存在,事件过滤器也不需要了解被监视对象的具体实现细节。