本文共 1824 字,大约阅读时间需要 6 分钟。
模式定义:
观察者模式定义了对象之间的一对多依赖关系。简单来说,一个主题对象的变化可以同时通知多个观察者对象,使得所有相关对象可以同步更新。这类似于订阅者模式,所有依赖该主题的对象都可以获得最新信息。
这种模式的核心在于保持系统的耦合度尽可能低。当主题对象发生变化时,其所有关注的观察者都会收到通知并进行相应处理。观察者可以注册、解注册,这使得业务逻辑可以在运行时动态地建立起对象间的关系。
应用场景:
当我们需要对一个对象的状态进行跟踪或修改,而修改可能会影响多个相关对象时,观察者模式是个理想的选择。特别是在以下场景下尤其有用:
当一个对象的状态可能会触发其他对象的状态变化,而你并不确定哪些对象可能会受到影响时。
当对象之间的关系是动态建立或更改的,比如基于事件驱动的架构,观察者可以灵活地被管理。
优点:
开闭原则允许系统在不修改现有类的前提下扩展其功能。这使得观察者模式非常适合当系统需要扩展功能时不需要修改核心系统类。在观察者模式中,观察者接口和抽象类只需实现相关的方法,就可以随意添加新的处理逻辑。
与其他模式如策略模式不同,观察者模式允许对象之间的关系是在运行时创建的。通过调用 registerObserver() 方法,可以随时为主题对象增加新的观察者。这种灵活性使得系统可以轻松应对动态的问题和未知的需求。
在 JDK 和 Spring 中的应用:
JDK:
java.util.Observable 类是 JDK 中最早实现的观察者模式,它通过一个依赖列表来管理观察者。用户可以通过 registerObserver() 和 removeObserver() 方法将观察者添加或移除到列表中,然后通过 notifyObservers() 方法通知所有观察者。
java.util.Observer 接口定义了一个标准的观察者接口,所有实现这个接口的类都可以作为观察者。
Spring:
Spring Framework 提供了更简洁的应用场景。通过 org.springframework.context.ApplicationListener 接口,用户可以接听 ApplicationContext 发 MOSDom 事件。
org.springframework.context.event.ApplicationEvent 是一个特殊的事件类型,它允许应用程序监听器(ApplicationListener)接收到上下文启动或刷新事件。
关键实现:
一个基本的观察者模式结构大致如下:
Subject 接口定义了 registerObserver(), removeObserver(), notifyObservers() 三个方法。类似的,具体的实现类可能会用 ArrayList 存储观察者对象,并通过从列表中遍历调用每个观察者的 update() 方法传递信息。
优化后的示例代码省略具体实现细节,但总体结构遵循这样一个模式:
public abstract class Subject {protected List
public abstract void registerObserver(Observer observer); public abstract void removeObserver(Observer observer); public abstract void notifyObservers();
}
public interface Observer {void update(Subject subject, Object data);}
一个典型的 WeatherData 类实现观察者模式,可以在数据属性上进行状态改造,并触发 notifyObservers() 方法将任何修改内容推送给所有观察者。
还有一个具体的观察者 BaiduSite 类。当收到数据更新通知时,它可以根据需要展示到网站。
实际应用中,这种模式可以被框架如 Spring 显式使用,如通过 ApplicationListener 来监听事件。
总体而言,观察者模式使得系统能够在动态变化的情况下,有效地管理对象之间的依赖关系。它通过解耦关注点,使得系统能够以更灵活的方式扩展和维护代码。
转载地址:http://bwwrz.baihongyu.com/