瞎扯
还记得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();
}
}
简单吧.哈哈,就这样吧,日更第9天
交流群:493180098,这是个很少吹水,交流学习的群.
APP开发维护咨询群 : 492685472 ,承接APP迭代.开发维护.咨询业务,付费快速解决问题.