
以下是 观察者模式 (Observer Pattern) 的详细介绍,包含定义、优缺点、应用场景及代码实现:
以下通过 气象站数据发布系统 的案例演示观察者模式:
/**
* 观察者接口:定义数据更新方法
*/
public interface Observer {
void update(float temperature, float humidity);
}/**
* 被观察者接口:定义订阅、取消订阅和通知方法
*/
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}import java.util.ArrayList;
import java.util.List;
/**
* 具体被观察者:气象站(维护观察者列表并通知数据变化)
*/
public class WeatherStation implements Subject {
private final List<Observer> observers = new ArrayList<>();
private float temperature;
private float humidity;
// 注册观察者
@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, humidity);
}
}
// 气象站数据更新时触发通知
public void setMeasurements(float temperature, float humidity) {
this.temperature = temperature;
this.humidity = humidity;
notifyObservers();
}
}/**
* 具体观察者:手机显示设备
*/
public class MobileDisplay implements Observer {
@Override
public void update(float temperature, float humidity) {
System.out.println("[手机] 温度: " + temperature + "°C, 湿度: " + humidity + "%");
}
}
/**
* 具体观察者:电视显示设备
*/
public class TVDisplay implements Observer {
@Override
public void update(float temperature, float humidity) {
System.out.println("[电视] 当前气象数据 => 温度: " + temperature + "°C, 湿度: " + humidity + "%");
}
}public class Client {
public static void main(String[] args) {
// 创建被观察者(气象站)
WeatherStation weatherStation = new WeatherStation();
// 创建观察者(显示设备)
Observer mobileDisplay = new MobileDisplay();
Observer tvDisplay = new TVDisplay();
// 注册观察者
weatherStation.registerObserver(mobileDisplay);
weatherStation.registerObserver(tvDisplay);
// 更新气象数据,自动触发通知
System.out.println("===== 第一次数据更新 =====");
weatherStation.setMeasurements(25.5f, 65.0f);
// 移除一个观察者后再次更新
weatherStation.removeObserver(tvDisplay);
System.out.println("\n===== 第二次数据更新 =====");
weatherStation.setMeasurements(28.0f, 60.0f);
}
}===== 第一次数据更新 =====
[手机] 温度: 25.5°C, 湿度: 65.0%
[电视] 当前气象数据 => 温度: 25.5°C, 湿度: 65.0%
===== 第二次数据更新 =====
[手机] 温度: 28.0°C, 湿度: 60.0%+----------------+ +----------------+
| Subject | <>-----+ | Observer |
+----------------+ +----------------+
| +register() | | +update() |
| +remove() | +----------------+
| +notify() |
+----------------+
^
|
+----------------+
| ConcreteSubject|
+----------------+
| +getState() |
| +setState() |
+----------------+
|
|
+----------------+
| ConcreteObserver|
+----------------+
| +update() |
+----------------+java.util.Observable 和 java.util.Observer(但 Observable 类已过时,建议自定义实现)。
CopyOnWriteArrayList)。
观察者模式在 Java 生态中广泛应用,例如:
ActionListener 监听按钮点击事件。
ApplicationEvent 和 ApplicationListener。
Observable 和 Observer 实现响应式编程。
掌握该模式能有效提升系统的可扩展性和模块化程度。