在形式上講,觀察者模式與回調(diào)模式有很大的相似之處,對(duì)兩者使用都不是很熟練的同學(xué),可能會(huì)難以分辨。
觀察者模式
觀察者模式的簡(jiǎn)單代碼實(shí)現(xiàn)如下:
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();
}
}
我們首先聲明一個(gè)被觀察對(duì)象。
然后建立多個(gè)觀察者。
將多個(gè)觀察者都注冊(cè)到被觀察者里面。一個(gè)被觀察者維護(hù)者一個(gè)觀察者列表。
當(dāng)被觀察者數(shù)據(jù)更新時(shí),將會(huì)遍歷這個(gè)列表中所有的觀察者,一次調(diào)用觀察者的觀察方法。
由此可見(jiàn),在觀察者模式里面,我們的中心人物是被觀察者,被觀察者負(fù)責(zé)維護(hù)觀察者列表,被觀察者負(fù)責(zé)一一通知觀察者。
回調(diào)模式
回調(diào)函數(shù)的簡(jiǎn)單代碼實(shí)現(xiàn)如下:
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();
}
}
通過(guò)對(duì)比,我們發(fā)現(xiàn),觀察者模式和回調(diào)函數(shù)模式及其相似,差別僅在于在觀察者模式中,被觀察者維護(hù)這一個(gè)觀察者列表,而在回調(diào)模式中,“被觀察者”只是保存了一個(gè)“觀察者”。這就是形式上的終極區(qū)別。
也就是說(shuō),回調(diào)函數(shù)是一種特殊的觀察者模式,是一種一對(duì)一的觀察者模式。