1.简介
观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。
在此模式下,一个对象(被观察者)可以管理一大批观察者对象,并且在自己的状态发生变化时,通过接口通知观察者们,而观察者们接到通知后,可以分别作出相应的动作。优点是:观察者与被观察者之间不会产生直接耦合,但它们是抽象耦合的(通过接口),观察者模式又被称作发布/订阅模式。
2.UML图
3.简单实例代码
分为Student和Teacher类,分别代表观察者和被观察者,老师布置作业
public class Student implements Observer {
private String name;
Student(String name) {
this.name = name;
}
@Override
public void update(Observable observable, Object o) {
Log.d(TAG, "name: " + name + " content" + o);
}
}
public class Teacher extends Observable {
public void pushHomework(String content) {
setChanged();
notifyObservers(content);
}
}
二者相互调用
teacher = new Teacher();
teacher.addObserver(new Student("张三"));
teacher.addObserver(new Student("李四"));
teacher.addObserver(new Student("王二"));
teacher.pushHomework("抄写 道德经");
4.观察者模式在RecyclerView中的调用
- RecyclerView的Adpter.notifyDataSetChanged为什么能刷新界面?
- RecyclerView的观察者,在哪里被注册和注销的呢?
用到RecyclerView,其实对我们来讲最能够接触的的是Adapter
Adapter里的 notifyDataSetChanged()
public final void notifyDataSetChanged() {
this.mObservable.notifyChanged();
}
主动去调用被观察者的 notifyChange 从而引起观察者的改变
AdapterDataObservable
static class AdapterDataObservable extends Observable<RecyclerView.AdapterDataObserver> {
AdapterDataObservable() {
}
//...省略部分代码
public void notifyChanged() {
for(int i = this.mObservers.size() - 1; i >= 0; --i) {
((RecyclerView.AdapterDataObserver)this.mObservers.get(i)).onChanged();
}
}
//...省略部分代码
}
从一个list里逐一去调用onChange方法,这也就是为啥提倡使用notifyByPosition(int position)
AdapterDataObserver
public abstract static class AdapterDataObserver {
public AdapterDataObserver() {
}
public void onChanged() {
}
public void onItemRangeChanged(int positionStart, int itemCount) {
}
public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) {
this.onItemRangeChanged(positionStart, itemCount);
}
public void onItemRangeInserted(int positionStart, int itemCount) {
}
public void onItemRangeRemoved(int positionStart, int itemCount) {
}
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
}
}
实现类 RecyclerViewDataObserver
private class RecyclerViewDataObserver extends RecyclerView.AdapterDataObserver {
RecyclerViewDataObserver() {
}
public void onChanged() {
RecyclerView.this.assertNotInLayoutOrScroll((String)null);
RecyclerView.this.mState.mStructureChanged = true;
RecyclerView.this.processDataSetCompletelyChanged(true);
if (!RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
RecyclerView.this.requestLayout();
}
}
//...省略部分代码
}
重点就是这个requestLayout 顾名思义就是重新布局 具体看自定义View
大概就是这个样子,简单易读。