在形式上講,觀察者模式與回調(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)用觀察者的觀察方法围俘。
由此可見砸讳,在觀察者模式里面,我們的中心人物是被觀察者界牡,被觀察者負(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ì)一的觀察者模式酗钞。