Java设计模式——观察者模式
⚪观察者模式(Observer)是一种行为型设计模式,这个模式也称为发布-订阅模式。
⚪意图:它定义了对象之间的一对多依赖关系,以便当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
- 主题(Subject): 主题是被观察的对象,它维护了一个观察者列表,并提供方法来添加、删除和通知观察者。当主题的状态发生变化时,它会通知所有注册的观察者。
- 观察者(Observer): 观察者是依赖于主题状态的对象。它定义了一个更新方法,主题在状态变化时会调用这个方法以通知观察者更新自身。
▷ 工作流程:
- 主题对象维护一个观察者列表(通常是一个列表或集合)。
- 观察者对象通过注册(订阅)自己到主题,将自己添加到主题的观察者列表中。
- 当主题的状态发生变化时,它会遍历观察者列表,并调用每个观察者的更新方法。
- 观察者对象在收到通知后执行相应的操作,以响应主题状态的变化。
▷ 示例
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 观察者接口
interface Observer {
void update(float temperature);
}
// 具体主题
class WeatherStation implements Subject {
private List<Observer> observers = new ArrayList<>();
private float temperature;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature);
}
}
// 当温度发生变化时,通知观察者
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObservers();
}
}
// 具体观察者
class TemperatureDisplay implements Observer {
private float temperature;
@Override
public void update(float temperature) {
this.temperature = temperature;
display();
}
public void display() {
System.out.println("温度显示器:当前温度为 " + temperature + " 度");
}
}
class Fan implements Observer {
@Override
public void update(float temperature) {
if (temperature > 28) {
System.out.println("风扇:温度高,启动风扇!");
} else {
System.out.println("风扇:温度正常,关闭风扇。");
}
}
}
public class ObserverPatternExample {
public static void main(String[] args) {
// 创建主题
WeatherStation weatherStation = new WeatherStation();
// 创建观察者
TemperatureDisplay temperatureDisplay = new TemperatureDisplay();
Fan fan = new Fan();
// 注册观察者
weatherStation.registerObserver(temperatureDisplay);
weatherStation.registerObserver(fan);
// 模拟温度变化并通知观察者
weatherStation.setTemperature(25);
weatherStation.setTemperature(30);
}
}
⚪适用性
- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的。
⚪应用场景
- 事件处理机制: 观察者模式常用于实现事件处理系统。当一个事件发生时,观察者可以订阅该事件,并在事件发生时接收通知并执行相应的操作。
- GUI 开发: 在图形用户界面 (GUI) 开发中,观察者模式常用于处理用户界面组件和数据模型之间的关系。例如,当数据模型的状态变化时,相关的界面组件可以自动更新。
- 发布-订阅系统: 观察者模式也被称为发布-订阅模式,用于实现消息队列、事件总线等系统。发布者发布消息,订阅者订阅感兴趣的消息,当消息发布时,所有订阅者都会收到通知。
- 报警系统: 观察者模式可以用于实现报警系统。监测某些条件的变化,当条件满足时触发报警通知。
- 股票市场: 股票市场中的股票价格变化可以看作是主题,投资者可以作为观察者订阅这些价格变化以做出投资决策。
⚪实际已有场景
- Spring Application Events: Spring 框架提供了一种事件(Event)机制,允许应用内部的不同组件相互通信。您可以定义自己的事件类,将事件发布者和事件监听器(观察者)注册到 Spring 容器中,然后在特定情况下发布事件,触发监听器的回调方法。
- Spring MVC: 在 Spring MVC 中,控制器可以发布事件,而视图可以作为观察者监听这些事件。当控制器处理请求后,可以发布一个事件,然后视图可以根据事件的内容更新用户界面。
- Spring Boot Starter: Spring Boot Starter 是 Spring Boot 中的一个重要概念,它是一种扩展机制,允许您将多个依赖项捆绑成一个可重用的 Starter。这种机制可以看作是观察者模式的一种应用,其中 Starter 监听 Spring Boot 的启动事件,然后根据需要执行特定的配置和初始化。

浙公网安备 33010602011771号