一、概述
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
二、角色
-
主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
-
观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
-
具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
-
具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。
三、观察者模式
1.主体
被观察者
Java 自带的 Observable 类
java.util.Observable.java
2.观察者
Java 自带的 Observer 类
java.util.Observer.java
3.具体主体
public class WeatherStation extends Observable {
public void updateTemperature(float temperature) {
// 必须调用 setChanged() 才能通知
setChanged();
// 推送数据给所有观察者
notifyObservers(temperature);
}
}
4.具体观察者
public class PhoneDisplay implements Observer {
@Override
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherStation) {
float temp = (float) arg;
System.out.println("手机显示: 天气更新,当前温度 = " + temp + "°C");
}
}
}
public class WebDisplay implements Observer {
@Override
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherStation) {
float temp = (float) arg;
System.out.println("网页显示: 温度已更新为 " + temp + "°C");
}
}
}
5.测试
@Test
public void testObserver() {
// 创建被观察者
WeatherStation station = new WeatherStation();
// 创建观察者
PhoneDisplay phone = new PhoneDisplay();
WebDisplay web = new WebDisplay();
// 注册观察者
station.addObserver(phone);
station.addObserver(web);
// 模拟温度变化
station.updateTemperature(25.5f);
station.updateTemperature(27.0f);
}
结果:
网页显示: 温度已更新为 25.5°C
手机显示: 天气更新,当前温度 = 25.5°C
网页显示: 温度已更新为 27.0°C
手机显示: 天气更新,当前温度 = 27.0°C