美文网首页程序员
观察者模式与回调函数

观察者模式与回调函数

作者: 老呼 | 来源:发表于2017-05-15 10:52 被阅读423次

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

    观察者模式

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

    
    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();
       }
    }
    
    

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

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

    相关文章

      网友评论

        本文标题:观察者模式与回调函数

        本文链接:https://www.haomeiwen.com/subject/spzcxxtx.html