观察者模式是一种行为型设计模式,主要应用于需要解耦的场合。以下是观察者模式的详细解释:
一、核心概念
- 被观察者:拥有状态,当状态发生变化时,会通知所有的观察者。
- 观察者:监听被观察者的状态,当被观察者状态发生变化时,会收到通知并作出反应。
二、关键角色
- Subject:定义了添加、删除观察者以及通知观察者的方法。
- ConcreteSubject:实现了Subject接口,维护了观察者的列表,并在状态变化时通知所有观察者。
- Observer:定义了一个更新方法,用于接收被观察者的状态变化通知。
- ConcreteObserver:实现了Observer接口,实现了具体的更新逻辑。
三、应用场景
- 数据监控:如股票价格变动通知关注者。
- UI更新:如Android中的点击监听事件、ContentObserver等。
- 其他需要解耦的场景:如房子价格变动通知关注者等。
四、优点
- 解耦:让耦合的双方都依赖于抽象,减少直接依赖,提高系统灵活性。
- 提高可维护性:通过观察者模式,可以更容易地添加或删除观察者,而不需要修改被观察者的代码。
五、缺点
- 开发和调试复杂:需要定义多个接口和实现类,增加了开发和调试的难度。
- 执行效率可能降低:在Java中,消息通知通常是顺序执行的,可能导致整体执行效率降低。因此,通常会采用异步实现来提高效率。
六、实现方式
- 手动实现:需要定义被观察者的抽象接口、具体的观察者对象、观察者抽象接口和具体的实现类。在Java中,可以通过定义接口和实现类来实现。
- 利用系统API:如在Java中,可以使用java.util包中的Observer和Observable类来实现观察者模式。被观察者需要继承Observable类,观察者需要实现Observer接口并实现update方法。
七、实例
以送奶工为例,送奶工是被观察者,张三、赵四、王五是观察者。送奶工在送奶时会通知所有的观察者来取奶。如果某六想订奶,他会告诉送奶工,以后他也要订奶。送奶工下次送奶时就会通知某六。如果张三不再订奶,他会告知送奶工,送奶工以后就不会再通知张三了。
通过观察者模式,可以实现对象之间的松耦合,提高程序的可维护性和灵活性。