设计模式之观察者模式
概述
观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会自动收到通知并进行更新。
在 Java 中,可以使用 java.util.Observable 和 java.util.Observer 来实现观察者模式。其中,Observable 是主题对象,Observer 是观察者对象。
具体实现步骤如下:
定义主题对象(Observable)和观察者对象(Observer)。
在主题对象中定义一个用于添加和移除观察者的方法,并在数据发生变化时通知所有观察者。
在观察者对象中实现 update() 方法,用于接收主题对象的通知并进行相应的处理。
示例
主题对象(Observable):
import java.util.Observable;
public class Subject extends Observable {
private int data;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
setChanged();
notifyObservers();
}
}
观察者对象(Observer):
import java.util.Observable;
import java.util.Observer;
public class ObserverA implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("ObserverA received the update.");
}
}
public class ObserverB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("ObserverB received the update.");
}
}
使用示例:
public class Test {
public static void main(String[] args) {
Subject subject = new Subject();
ObserverA observerA = new ObserverA();
ObserverB observerB = new ObserverB();
subject.addObserver(observerA);
subject.addObserver(observerB);
subject.setData(1);
}
}
输出结果:
ObserverA received the update.
ObserverB received the update.
说明
可以看到,当主题对象的数据发生变化时,所有的观察者都会收到通知并进行相应的处理。
总结
观察者模式的优点包括:
- 降低了系统的耦合度,被观察者和观察者之间的关系松散,易于扩展。
- 可以实现广播通信,被观察者不需要知道观察者的存在,只需要通知即可。
- 观察者模式符合开闭原则,增加新的观察者不会影响被观察者的代码。
观察者模式的缺点包括:
- 如果观察者过多,通知所有观察者的时间会很长,影响系统性能。
- 观察者和被观察者之间的关系是双向的,增加了系统的复杂度。
- 如果观察者和被观察者之间存在循环依赖,会导致系统崩溃。