Android 观察者模式
来源:互联网 发布:巨人网络a股上市 编辑:程序博客网 时间:2024/06/17 21:32
观察者模式,定义了对象间一种一对多的依赖关系,当被观察者状态发生变化时,它的观察者们会收到通知并自动更新。
应用
在java语言的java.util库里面,提供了一个Observable类以及一个Observer接口,构成Java语言对观察者模式的支持。
Android 观察者最常见有addTextChangedListener等。
Observable/Observer示例
Oservable被观察者
被观察者,一个被观察者对象可以有数个观察者对象
public class ConcreteObservable extends Observable { private int data = 0;public int getData() { return data;}public void setData(int i) { //具体逻辑按需 if (data != i) { this.data = i; setChanged(); }}private static ConcreteObservable observable;public static synchronized ConcreteObservable getInstance() { if (observable == null) { observable = new ConcreteObservable(); } return observable;}public ConcreteObservable post() { //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。 notifyObservers(); return observable;}public ConcreteObservable post(Object arg) { setChanged(); //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。 notifyObservers(arg); return observable;}}
Observable 源码:
public class Observable { private boolean changed = false; private final ArrayList<Observer> observers;/** Construct an Observable with zero Observers. */public Observable() { observers = new ArrayList<>();}/** * 将一个观察者添加到观察者集合 */public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!observers.contains(o)) { observers.add(o); }}/** * 删除观察者 */public synchronized void deleteObserver(Observer o) { observers.remove(o);}/** * 如果该对象发生了变化,由所指示的 hasChanged方法,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变 */public void notifyObservers() { notifyObservers(null);}/** * 如果该对象发生了变化,由所指示的 hasChanged方法,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变 */public void notifyObservers(Object arg) { Observer[] arrLocal; synchronized (this) { if (!hasChanged()) return; arrLocal = observers.toArray(new Observer[observers.size()]); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) arrLocal[i].update(this, arg);}/** * 清除观察者列表,不再有任何观察者 */public synchronized void deleteObservers() { observers.clear();}/** * 观测对象为已改变 */protected synchronized void setChanged() { changed = true;}/** * 指示对象不再改变,或者说,它已通知其所有最近改变其观察员 */protected synchronized void clearChanged() { changed = false;}/** * 测试此对象已经改变 */public synchronized boolean hasChanged() { return changed;}/** * 返回观察者人数 */public synchronized int countObservers() { return observers.size();}}
Observer 观察者
Observer 是个接口,在需要观察的地方实现:
public class ObserverActivity extends AppCompatActivity implements Observer { ConcreteObservable observable;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observer); observable = ConcreteObservable.getInstance(); observable.addObserver(this); observable.setData(1); observable.post(); observable.setData(1); observable.post(); observable.post(2);}@Overridepublic void update(Observable o, Object arg) { ConcreteObservable concreteObservable = (ConcreteObservable) o; Log.d("wxl", "ObserverActivity=" + concreteObservable.getData() + ",arg=" + arg);}@Overrideprotected void onDestroy() { super.onDestroy(); //删除观察者 observable.deleteObserver(this);}}
Observer源码:
public interface Observer {
/**
* 当被观察者对象的状态发生变化时,被观察者对象的notifyObservers()方法就会* 调用这一方法。
*/
void update(Observable o, Object arg);}
最后打印:
ObserverActivity=1,arg=null
ObserverActivity=1,arg=2
阅读全文
0 0
- Android之观察者模式
- android观察者模式
- Android|Java观察者模式
- Android Observer观察者模式
- Android Observer观察者模式
- android观察者模式
- android 观察者模式
- android--观察者模式
- android 观察者模式解析
- Android 之 观察者模式
- Android观察者模式
- Android中的观察者模式
- Android 观察者模式
- Android 观察者模式
- android 观察者模式
- android 观察者模式
- android 观察者模式
- android自定义观察者模式
- react-native之打包apk时报错
- bzoj4726 [POI2017]Sabota 二分+暴力
- linux的目录管理
- 野狗云API之详解(分页,查询,删除,更新)-yellowcong
- Android使用友盟集成QQ、微信、微博等第三方分享
- Android 观察者模式
- (64)LinkList特有方法:方法名带first,last
- 算法-->插入排序
- 使用科大讯飞提供的SDK实现android语音识别
- Android中实现滑动的方式
- ubuntu 16.04换源 网易、搜狐、阿里云
- cocos2d-lua模拟器调出控制台输出
- 强大的vim配置,让编程更随意
- 网络流专题