前言
观察者模式是一种行为型设计模式,它允许多个对象监听另一个对象的状态变化,并在状态变化时做出相应的处理。
组成
观察者模式由以下组成部分:
-
Subject(抽象主题):它把所有观察者对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
-
ConcreteSubject(具体主题):将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。
-
Observer(抽象观察者):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
-
ConcreteObserver(具体观察者):实现抽象观察者所要求的更新接口,以便使本身的状态与主题的状态相协调。
类图
观察者模式的类图如下所示:
(图源 | 《图解设计模式》)
使用场景
观察者模式通常在以下场景中使用:
-
当多个对象需要了解另一个对象的状态变化时,可以使用观察者模式。例如,在 Android 应用程序中,多个 Fragment 或 Activity 需要了解 Service 的状态变化。
-
当一个对象状态的改变需要同时改变其他对象的状态时,可以使用观察者模式。例如,在 Android 应用程序中,当用户更改应用程序的主题时,所有的 UI 组件的状态都需要相应地改变。
Android 中涉及到的观察者模式
在 Android 中,观察者模式广泛应用于各种组件和框架中。以下是一些常见的 Android 组件和框架,它们使用了观察者模式来处理状态变化:
-
BroadcastReceiver:BroadcastReceiver 是一个 Android 组件,它可以监听系统事件的发生,并在事件发生时执行相应的操作。BroadcastReceiver 使用观察者模式来监听系统事件,并在事件发生时通知应用程序。例如,当用户插入耳机时,系统会发出一个 ACTION_HEADSET_PLUG 的广播,应用程序可以注册一个 BroadcastReceiver 来监听该广播,并在广播发生时执行相应的操作。
-
LiveData:LiveData 是一个可以观察数据变化的类,它使用观察者模式来通知 UI 组件数据的变化。LiveData 可以在数据发生变化时通知所有注册的观察者,并确保 UI 组件与 LiveData 中的数据保持同步。
-
ViewModel:ViewModel 是一个与界面无关的类,用于处理数据和业务逻辑。在 Android 应用程序中,多个 UI 组件通常需要访问相同的数据源,例如数据库或网络服务。ViewModel 使用观察者模式来维护数据的状态,并在数据发生变化时通知所有注册的观察者。
总结
观察者模式是一种非常常用的设计模式,它可以帮助我们将多个对象解耦,从而使系统更加灵活和可扩展。在 Android 应用程序中,观察者模式广泛应用于各种组件和框架中,例如 BroadcastReceiver、LiveData 和 ViewModel 等。通过使用观察者模式,我们可以将应用程序的业务逻辑和 UI 组件分离,使代码更加清晰和易于维护。