美文网首页程序员
观察者模式--回调模式

观察者模式--回调模式

作者: _VITA | 来源:发表于2018-04-05 16:22 被阅读0次

不要字面的理解监听器,它不是主动去检查事件是否发生的,所以不存在每时每刻这种说法。早期是有隔一定时间间隔之后去检查轮询。
对于我们来说,Android中的Listener其实只是一种Callback,是回调方法。是当事件发生时,由事件发起者或者内部处理者调用的方法。(该方法为一个接口里的方法),在要做出反应的这一方先implements这个接口,set(相当于订阅,将观察者(监听器)与被观察者(被监听的)联系起来了),将接口方法实现。于是监听器就实现了。

  • 基本原理
public class Employee{
  private Callback mCallback;//定义回调接口对象成员变量
  public interface Callback{//声明回调接口,相当于观察者
    public abstract void work();
  };
  public void setCallback (Callback callback){//设置回调接口对象的成员变量
    this.mCallback = callback;
  }
  public void dowork(){//调用回调接口中的方法
    mCallback.work();
  }
}
public class Boss{
    private Employee employee;
    public void setCallback(new Employee.Callback(){//形成订阅关系
        @Override 
        public void work(){
            System.out.println("click");
        }
    })
      public void onCall(){
         employee.dowork();
      }
  
}
  • listener的话 就把 callback==》listener相当于观察者,work==》onXXX,Employee==》View啊 item等等被观察者.。当employee执行了onwork方法,就会调用System.out.println("click");

  • listview中adapter的notifydatachange也是观察者模式。部分源码如下:

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    
  private final DataSetObservable mDataSetObservable = new DataSetObservable();// 相当于Employee,被观察者

     //相当于setcallback,DataSetObserver观察者
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
    */
    //相当于 onCall;     
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
}
public class DataSetObservable extends Observable<DataSetObserver> {
    /**
     * Invokes {@link DataSetObserver#onChanged} on each observer.
     * Called when the contents of the data set have changed.  The recipient
     * will obtain the new contents the next time it queries the data set.
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            // since onChanged() is implemented by the app, it could do anything, including
            // removing itself from {@link mObservers} - and that could cause problems if
            // an iterator is used on the ArrayList {@link mObservers}.
            // to avoid such problems, just march thru the list in the reverse order.
            //相当于所有的mCallback.work();
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }

    /**
     * Invokes {@link DataSetObserver#onInvalidated} on each observer.
     * Called when the data set is no longer valid and cannot be queried again,
     * such as when the data set has been closed.
     */
    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}

相关文章

  • Android中设计模式简单举例

    1、回调是观察者模式的简单形式。 观察者模式也就是将回调上升到设计模式的理论高度上了而已。 2、单例模式 3、适配...

  • 设计模式详解——观察者模式

    本篇文章介绍一种设计模式——观察者模式。观察者模式在Android中有着很多的应用,如按钮监听,接口回调以及很多流...

  • 观察者模式--回调模式

    不要字面的理解监听器,它不是主动去检查事件是否发生的,所以不存在每时每刻这种说法。早期是有隔一定时间间隔之后去检查...

  • node 事件循环

    概念 -单线程、单进程,结合V8的异步回调接口,处理大量并发-API支持回调函数-事件机制采用设计模式中观察者模式...

  • 对于Java中观察者模式的理解

    最近学习有关Rxjava有关知识,上来就被观察者模式给唬住了,其实观察者模式本质上就是接口的回调! Android...

  • 编程模式·观察者模式、事件通知、消息队列三者区别

    观察者模式、事件通知、消息队列三者有类似,都有回调函数注册,通知调用的设计,容易混淆。 简述和区别 观察者模式:被...

  • 观察者模式与回调函数

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

  • JS的四种异步模式:回调、事件、观察者、promise

    参考文章:前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象J...

  • mAdapter.notifyDataSetChanged();

    咱们先看看观察者模式和接口回调的关系: https://blog.csdn.net/cauchyweierstra...

  • JS之异步编程方法

    异步方法有:回调函数、事件监听、发布订阅(观察者模式)、Promise对象、Generator、Async/Awa...

网友评论

    本文标题:观察者模式--回调模式

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