使用率很高,常常用于GUI系统、订阅-发布系统,他讲观察者与被观察者进行解耦。
定义:是一种一对多的关系,当一个对象状态改变,依赖与他的其他对象就会得到通知,并且更行。
使用场景:
1.关联行为场景,注意关联行为是可拆分的,而不是‘组合’关系。
2.时间多级出发机制
3.跨系统的消息交换场景,如消息队列,事件总线的处理机制。
结构:
Subject类:抽象的被观察者,把所有的观察者存储在一个集合里。
ConcreteSubject:具体被观察者类,内部状态改变时,给所有注册过的观察者发送消息。
Observer:抽象观察者,定义了一个借口,使得在得到主题的更改通知时更新自己。
ConcreteObserver:实现了接口方法。
Android 源码:
listView的notifyDataSetchanged方法,这个方法定义在BaseAdapter中。
BaseAdapter里面有一个成员变量mDataSetOvservable,当我们调用notifyDataSetChanged的时候,其实调用了mDataSetOvservable.notifyChanged()。
而这个方法里面进行了一个循环,遍历mObservers,调用onChanged()方法。
这些观察者是ListView通过setAdapter方法设置Adapter产生的,在设置Adapter的时候会构建一个AdapterDataSetObserver,然后注册到adapter中。
onchange方法中调用requestLayout()方法对listview进行重新布局。