在形式上讲,观察者模式与回调模式有很大的相似之处,对两者使用都不是很熟练的同学,可能会难以分辨。
观察者模式
观察者模式的简单代码实现如下:
public class ConcretSubject {
private List<Observer> observers = new ArrayList<>();
public void register(Observer observer) {
observers.add(observer);
}
public void call() {
for (Observer observer : observers) {
observer.oncall();
}
}
}
public interface Observer {
void oncall();
}
public class Main {
public static void main(String[] args) {
ConcretSubject subject = new ConcretSubject();
Observer observer = () -> System.out.println("observer");
subject.register(observer);
subject.call();
}
}
我们首先声明一个被观察对象。
然后建立多个观察者。
将多个观察者都注册到被观察者里面。一个被观察者维护者一个观察者列表。
当被观察者数据更新时,将会遍历这个列表中所有的观察者,一次调用观察者的观察方法。
由此可见,在观察者模式里面,我们的中心人物是被观察者,被观察者负责维护观察者列表,被观察者负责一一通知观察者。
回调模式
回调函数的简单代码实现如下:
public class ConcretSubject {
private Callback callback;
public void register(Callback callback) {
this.callback = callback;
}
public void call() {
callback.onCall();
}
}
public interface Callback {
void onCall();
}
public class Main {
public static void main(String[] args) {
ConcretSubject subject = new ConcretSubject();
Callback callback = new Callback() {
@Override
public void onCall() {
System.out.println("call");
}
};
subject.register(callback);
subject.call();
}
}
通过对比,我们发现,观察者模式和回调函数模式及其相似,差别仅在于在观察者模式中,被观察者维护这一个观察者列表,而在回调模式中,“被观察者”只是保存了一个“观察者”。这就是形式上的终极区别。
也就是说,回调函数是一种特殊的观察者模式,是一种一对一的观察者模式。
网友评论