觀察者模式與回調(diào)函數(shù)

在形式上講,觀察者模式與回調(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ì)一的觀察者模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容