观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象(称为观察者)的状态发生变化时,所有依赖于它的对象(称为订阅者)都将得到通知并自动更新。
工作原理:
观察者模式包含两个主要角色:
- Subject(主题):也称为观察目标,它负责维护一个观察者列表。当主题的状态发生变化时,会通知所有注册的观察者。
- Observer(观察者):订阅主题的状态变化,并在接到通知时根据主题的改变更新自己的状态。
协作:
- Subject注册Observer到它的观察者列表中。
- 当Subject的状态发生变化时,它会通知所有注册的Observer。
- Observer接收到通知后,根据Subject的状态变化来更新自己的状态。
在Java中的应用:
Java中的java.util.Observable
和java.util.Observer
接口是实现观察者模式的基础。下面是一个简单的示例:
import java.util.Observable; import java.util.Observer; // 被观察者 class WeatherData extends Observable { private float temperature; private float humidity; private float pressure; public void setData(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; this.pressure = pressure; // 数据变化,通知观察者 setChanged(); notifyObservers(); } public float getTemperature() { return temperature; } // 其他获取数据的函数... } // 观察者 class CurrentConditions implements Observer { private float temperature; private float humidity; public CurrentConditions(WeatherData weatherData) { weatherData.addObserver(this); } public void update(Observable o, Object arg) { WeatherData weatherData = (WeatherData)o; temperature = weatherData.getTemperature(); humidity = weatherData.getHumidity(); // 更新用户界面 } // 其他更新UI的函数... } public class ObserverPatternDemo { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditions currentConditions = new CurrentConditions(weatherData); // 模拟数据变化,观察者将收到通知 weatherData.setData(20.0f, 65.0f, 30.0f); } }
在这个例子中,WeatherData
类是Subject,它有一个setData
方法,当这个方法被调用时,会通知所有注册的Observer。CurrentConditions
类是Observer,它实现了Observer
接口,并在构造函数中注册了自己到WeatherData
。当WeatherData
的状态发生变化时,CurrentConditions
会接收到通知并更新自己的状态。
观察者模式的优点在于它可以建立一种松耦合的关系,使得Subject和Observer可以独立变化,不需要知道彼此的具体实现细节。这使得系统更加灵活和可扩展。