Java学设计模式之观察者模式
一、观察者模式概念
1.1 什么是观察者模式
观察者模式是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
结构
观察者模式通常包含以下几个要素:
-
Subject(主题): 维护一系列观察者对象,并提供方法来添加、删除和通知观察者对象。
-
Observer(观察者): 定义一个更新接口,以便在主题状态发生变化时接收通知。
-
ConcreteSubject(具体主题): 具体的主题对象,维护当前的状态,并在状态发生改变时通知其观察者。
-
ConcreteObserver(具体观察者): 实现了观察者接口的具体观察者对象,当接收到主题的通知时进行相应的更新。
二、观察者模式代码
2.1 主题
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
2.2 具体主题
public class WeatherStation implements Subject {
private List<Observer> observers = new ArrayList<>();
private float temperature;
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObservers();
}
@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);
}
}
}
2.3 观察者
public interface Observer {
void update(float temperature);
}
2.4 具体观察者
public class PhoneApp implements Observer{
@Override
public void update(float temperature) {
System.out.println("手机App收到天气更新,当前温度:" + temperature);
}
}
public class Website implements Observer{
@Override
public void update(float temperature) {
System.out.println("网站收到天气更新,当前温度:" + temperature);
}
}
2.5 测试类
public class ObserverPatternTest {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
PhoneApp phoneApp = new PhoneApp();
Website website = new Website();
weatherStation.registerObserver(phoneApp);
weatherStation.registerObserver(website);
// 模拟天气更新
weatherStation.setTemperature(25);
// 输出:
// 手机App收到天气更新,当前温度:25.0
// 网站收到天气更新,当前温度:25.0
}
}
三、总结
观察者模式的优点包括:
- 主题和观察者之间的松耦合,使得它们可以独立地进行修改和扩展。
- 支持广播通信,当一个主题状态改变时,所有依赖于它的观察者都会自动更新。
缺点包括:
- 如果观察者太多或者通知频繁,可能会导致性能问题。
- 如果观察者之间有复杂的依赖关系,可能会引起混乱和不易维护。