观察者模式与回调函数

在形式上讲,观察者模式与回调模式有很大的相似之处,对两者使用都不是很熟练的同学,可能会难以分辨。

观察者模式

观察者模式的简单代码实现如下:


public class ConcretSubject {
   private List 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();
   }
}

通过对比,我们发现,观察者模式和回调函数模式及其相似,差别仅在于在观察者模式中,被观察者维护这一个观察者列表,而在回调模式中,“被观察者”只是保存了一个“观察者”。这就是形式上的终极区别。

也就是说,回调函数是一种特殊的观察者模式,是一种一对一的观察者模式。

你可能感兴趣的:(观察者模式与回调函数)