23种设计模式-行为型模式之观察者模式(Java版本)
Java 观察者模式(Observer Pattern)详解
🧠 什么是观察者模式?
观察者模式是一种行为型设计模式,定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生变化时,所有依赖它的对象都会得到通知并自动更新。
🎯 使用场景
- 一个对象状态的变化需要通知多个对象
- 系统中存在一对多的依赖关系
- 实现事件处理系统(如GUI、订阅/发布)
🏗️ 模式结构
- Subject(主题):被观察的对象,提供注册和移除观察者的方法
- Observer(观察者):定义响应更新的方法
- ConcreteSubject / ConcreteObserver:具体实现类
✅ 示例:天气预报系统
观察者接口(Observer)
public interface Observer {void update(float temperature, float humidity, float pressure);
}
主题接口(Subject)
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}
具体主题类
import java.util.ArrayList;
import java.util.List;public class WeatherData implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;private float humidity;private float pressure;@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(temperature, humidity, pressure);}}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObservers();}
}
具体观察者类
public class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("当前温度:" + temperature + "℃,湿度:" + humidity + "%");}
}
客户端调用
public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay display = new CurrentConditionsDisplay();weatherData.registerObserver(display);weatherData.setMeasurements(26.5f, 65.0f, 1013.0f);}
}
✅ 优点
- 降低耦合性,实现松散耦合的通知机制
- 易于添加新观察者,符合开闭原则
⚠️ 缺点
- 观察者太多时通知会影响性能
- 通知链可能较复杂,调试困难
🧩 使用建议
适合构建事件驱动系统、发布订阅模型,也广泛应用于GUI框架、MVC架构中。