设计模式 19:观察者模式
定义与目的
- 定义:观察者模式定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
- 目的:该模式的主要目的是允许一个对象(称为主体或被观察者)在状态发生变化时通知其他对象(称为观察者),从而实现对象之间的解耦。
实现示例
假设我们有一个天气预报系统,需要支持实时更新天气信息。我们可以使用观察者模式来实现这个需求。
// 观察者接口
interface Observer {
void update(float temperature, float humidity, float pressure);
}
// 主体接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体主体 - 天气数据
class WeatherData implements Subject {
private List<Observer> observers = new ArrayList<>();
private float temperature;
private float humidity;
private float pressure;
@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, pressure);
}
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObservers();
}
}
// 具体观察者 - 当前条件显示器
class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
private float pressure;
@Override
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure= pressure;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + " F degrees and " + humidity + "% humidity" + "pressure " + pressure );
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
Observer currentDisplay = new CurrentConditionsDisplay();
weatherData.registerObserver(currentDisplay);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
weatherData.removeObserver(currentDisplay);
}
}
使用场景
- 当一个对象(主体)的状态发生改变时,需要通知其他对象(观察者)时。
- 当多个对象需要同时改变其状态,但是不知道彼此的存在时。
- 当一个对象需要向其他对象提供其状态信息,但又不想让其他对象直接访问其内部状态时。
观察者模式通过定义对象间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这对于需要实现事件驱动或实时更新机制的场景非常有用。
小结
观察者模式是一种常用的行为型模式,它可以帮助你实现对象间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这对于需要实现事件驱动或实时更新机制的场景非常有用。