Android开发经验谈Android实用技术

2019日更挑战(九),Android-聊聊观察者模式

2019-01-09  本文已影响33人  Jlanglang

瞎扯

还记得16年的时候,这个问题几乎是必问的面试题.那时我也不明白,这个有啥好问的.
哈哈

什么是观察者模式

顾名思义,有观察者,就被观察者.

观察者

就是接受通知的.接受被观察者的通知.然后做出反应

被观察者

就是发送通知的.接收观察者的订阅,当发现变化时,通知观察者.

观察者设计是一种一对多的组合关系,在一个对象的状态发生变化时,所有依赖于它的对象都会得到通知,然后做出响应。

从现实举例:
你的朋友发了一条朋友圈.然后所有可见的人都能收到,
你就是观察者,你的朋友就是被观察者.

红绿灯
当你过马路的时候,你就会观察红绿灯,当红绿灯发生变化时,你就会做出响应.
你是观察者,红绿灯是被观察者


Android中最常见的观察者模式

OnClickListener

我们常见的各种listener,callback回调
就拿setOnClickListener来说.
当View接受响应了onClick这个事件.
View做为被观察者.就会告知观察者listener.
实现的listener的onClick方法就是响应.

View是被观察者.Listener是观察者.

RecyclerView.ListView等的Adapter

有人会说,这不是适配器模式吗?
没错,adapter是指的适配器模式.
但是,安卓的各种列表View的adapter中还包含观察者模式

观察者是谁?

RecyclerView

//RecyclerView自带一个观察者对象
private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver();

private void setAdapterInternal(Adapter adapter, boolean compatibleWithPrevious,
            boolean removeAndRecycleViews) {
        if (mAdapter != null) {
            mAdapter.unregisterAdapterDataObserver(mObserver);//观察者取消注册
            mAdapter.onDetachedFromRecyclerView(this);
        }
        mAdapter = adapter;
        if (adapter != null) {
            adapter.registerAdapterDataObserver(mObserver);//观察者注册
            adapter.onAttachedToRecyclerView(this);
        }

    }

被观察者是谁?

Adapter

  public abstract static class Adapter<VH extends ViewHolder> {
        //自带一个观察者集合.
        private final AdapterDataObservable mObservable = new AdapterDataObservable();
}

那adapter是怎么通知观察者的呢?

adapter.notifyDataSetChanged()

是不是很熟悉.但确实是这个,这个通知是我们手动触发的.
是不是感觉观察者模式怎么这么低级的感觉?这么简单?

我记得刚入行的,我就觉得观察者,就是会自动通知变化.也就是,我把被观察者的属性变了.观察者就收到通知回调了.不需要做什么操作.
看来是我太天真了.其实这里面根本没有什么魔法.也没有多么的高级.


自实现一个

public class Test1 {
    //观察者
    public class Observer {
        public void onChange() {
            Log.i("观察者", "我收到通知了");
        }
    }

    //被观察者
    public class Observable {
        ArrayList<Observer> list = new ArrayList<>();

        public void register(Observer a) {
            list.add(a);
        }

        public void unRegister(Observer a) {
            list.remove(a);
        }

        public void notifyChange() {
            int size = list.size();
            Log.i("被观察者", "开始通知");
            for (int i = 0; i < size; i++) {
                Observer observer = list.get(i);
                observer.onChange();
            }
            Log.i("被观察者", "通知完了");
        }
    }

    public void test() {
        Observable observable = new Observable();
        Observer observer = new Observer();
        observable.register(observer);
        observable.notifyChange();
    }
}

image.png

简单吧.哈哈,就这样吧,日更第9天


您的喜欢与回复是我最大的动力-_-
交流群:493180098

上一篇 下一篇

猜你喜欢

热点阅读