引言
观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。在Java开发中,JDK本身提供了一种实现观察者模式的机制,即java.util.Observable和java.util.Observer接口。本文将深入解析JDK观察者模式的核心技术,并通过实战应用展示其使用方法。
观察者模式概述
定义
观察者模式是一种行为型设计模式,它允许一个对象(主题)在状态变化时通知多个依赖对象(观察者)。这种模式在Java中广泛应用于事件处理、消息队列等领域。
核心角色
- 主题(Subject):被观察的对象,它负责维护一个观察者列表,并在状态变化时通知所有观察者。
- 观察者(Observer):观察主题的对象,它需要实现
Observer接口,并在主题状态变化时更新自己的行为。
JDK观察者模式实现
Observable接口
java.util.Observable接口定义了主题的基本功能:
public interface Observable {
void addObserver(Observer o);
void deleteObserver(Observer o);
void notifyObservers();
void notifyObservers(Object arg);
}
addObserver(Observer o):向观察者列表中添加一个观察者。deleteObserver(Observer o):从观察者列表中删除一个观察者。notifyObservers():通知所有观察者,无额外参数。notifyObservers(Object arg):通知所有观察者,并传递一个额外参数。
Observer接口
java.util.Observer接口定义了观察者的基本功能:
public interface Observer {
void update(Observable o, Object arg);
}
update(Observable o, Object arg):当主题状态变化时,由主题调用此方法通知观察者。
实战示例
以下是一个简单的观察者模式实现,其中主题是温度计,观察者是温度显示器:
import java.util.ArrayList;
import java.util.List;
// 主题:温度计
class Thermometer implements Observable {
private double temperature;
private List<Observer> observers;
public Thermometer() {
observers = new ArrayList<>();
}
public void setTemperature(double temperature) {
this.temperature = temperature;
notifyObservers();
}
@Override
public void addObserver(Observer o) {
observers.add(o);
}
@Override
public void deleteObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this, null);
}
}
public double getTemperature() {
return temperature;
}
}
// 观察者:温度显示器
class TemperatureDisplay implements Observer {
private double temperature;
@Override
public void update(Observable o, Object arg) {
if (arg instanceof Double) {
temperature = (Double) arg;
displayTemperature();
}
}
private void displayTemperature() {
System.out.println("Current temperature: " + temperature);
}
}
// 主类
public class ObserverPatternDemo {
public static void main(String[] args) {
Thermometer thermometer = new Thermometer();
TemperatureDisplay display = new TemperatureDisplay();
thermometer.addObserver(display);
thermometer.setTemperature(30);
thermometer.setTemperature(25);
}
}
在这个例子中,当温度计的温度发生变化时,温度显示器会自动更新显示温度。
总结
JDK观察者模式提供了一种灵活且高效的事件处理机制。通过理解其核心技术和实战应用,开发者可以更好地利用这一设计模式,提高代码的可读性和可维护性。
