观察者模式--Java设计模式观察者模式定义:定义了对象之间的一对多的依赖,这样一来,当一个对象发生改变状态的时候,它的所有依赖者都会收到通知并自动更新。参考如下图:观察者设计模式也叫发布-订阅模式。也可以称作:出版者+订阅者=观察者模式在Android中观察者模式的实例有:广播机制,ContentObserver的注册方式,一个是同步的观察者模式,一个是异步的观察者模式。当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此的细节,观察者提供了一种对象的设计,可以降低之间的耦合,避免对象的双向依赖。举例:在Android中很多的Listener是观察者模式,比如点击事件的OnClickListener,就是为了避免对象的双向依赖。—-先来看看Java源码中的观察者模式:Observer观察者接口:packagecom.daming.java.observer;publicinterfaceObserver{voidupdate(Observableobservable,Objectarg);}123456对象Observable类的实现packagecom.daming.java.observer;importjava.util.Vector;publicclassObservable{privatebooleanchanged=false;privateVectorobs;publicObservable(){obs=newVector();}publicsynchronizedvoidaddObserver(Observero){if(o==null)thrownewNullPointerException();if(!obs.contains(o)){obs.addElement(o);}}publicsynchronizedvoiddeleteObserver(Observero){obs.removeElement(o);}publicvoidnotifyObservers(){notifyObservers(null);}publicvoidnotifyObservers(Objectarg){Object[]arrLocal;synchronized(this){if(!changed)return;arrLocal=obs.toArray();clearChanged();}for(inti=arrLocal.length-1;i=0;i--)((Observer)arrLocal[i]).update(this,arg);}publicsynchronizedvoiddeleteObservers(){obs.removeAllElements();}protectedsynchronizedvoidsetChanged(){changed=true;}protectedsynchronizedvoidclearChanged(){changed=false;}publicsynchronizedbooleanhasChanged(){returnchanged;}/***ReturnsthenumberofobserversofthisttObservable/ttobject.**@returnthenumberofobserversofthisobject.*/publicsynchronizedintcountObservers(){returnobs.size();}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970MyObserver观察者对象的实现packagecom.daming.java.observer;publicclassMyObserverimplementsObserver{@Overridepublicvoidupdate(Observableobservable,Objectarg){System.out.println(observable:+observable+arg:+arg);}}123456789MyObserver2观察者对象的实现packagecom.daming.java.observer;publicclassMyObserver2implementsObserver{@Overridepublicvoidupdate(Observableobservable,Objectarg){System.out.println(observable2:+observable+arg2:+arg);}}123456789TestObserver类的实现packagecom.daming.java.observer;publicclassTestObserver{/***@paramargs*/publicstaticvoidmain(String[]args){Observableobservable=newObservable();MyObservermyObserver=newMyObserver();MyObserver2myObserver2=newMyObserver2();observable.addObserver(myObserver);observable.addObserver(myObserver2);observable.setChanged();observable.notifyObservers(14);observable.setChanged();observable.notifyObservers(Iamdaming);}}123456789101112131415161718192021Log输入结果:observable2:com.daming.java.observer.Observable@14318bbarg2:14observable:com.daming.java.observer.Observable@14318bbarg:14observable2:com.daming.java.observer.Observable@14318bbarg2:Iamdamingobservable:com.daming.java.observer.Observable@14318bbarg:Iamdaming1234Java源码中上述代码中用的是推模式,当然源码中也有拉模式,即主动查询的模式。拉模式就像广播一样,通过onReceive()方法拉起来一些动作的,还有像ContentObserver可以通过拉模式,当数据库发生改变的时候,通过onChange()方法来调用一些操作。—-接着我们来看看Android中异步的观察者模式。ContentObserver就是异步的观察者模式,异步的观察者有什么好处呢?不阻塞观察者的回调。在同步通知中会有阻塞问题,各个Observer的响应方法是串行的,如果有一个observer耗时的话就会阻塞其他observer接收者了,这样就有可能就会引起bug来,所以在设计的时候多考虑一些,是否考虑用异步的观察者模式,让并发处理快一些;我们通过一个简单的demo来学习下异步的观察者模式:先来看看Observer,这个Android中是抽象的类packagecn.daming.observer.design;importandroid.os.Handler;importandroid.util.Log;publicabstractclassObserver{privateHandlermHandler;publicObserver(Handlerhandler){mHandler=handler;}publicvoidonChange(){}publicfinalvoiddispatchChange(){Log.v(daming,ObserverdispatchChangeismHandler==null:+(mHandler==null));if(mHandler==null){onChange();}else{mHandler.post(newNotificationRunnable());}}privatefinalclassNotificationRunnableimplementsRunnable{@Overridepublicvoidrun(){Log.v(daming,NotificationRunnabledispatchChangeisrun...);Observer.this.onChange();}}}1234567891011121314151617181920212223242526272829303132333435接着来看看ObserverService这个类的实现:packagecn.daming.observer.design;importjava.util.ArrayList;importjava.util.List;importandroid.util.Log;publicclassObserverService{privateintmState;privateListObservermObservers=newArrayListObserver();publicfinalvoidregisterObserver(Observerobserver){if(!mObservers.contains(observer)){mObservers.add(observer);}}publicfinalvoidunregisterObserver(Observerobserver){Log.v(daming,ObserverServiceunregisterObserver:);mObservers.remove(observer);}publicvoidnotifyChange(){for(Observerobserver:mObservers){observer.dispatchChange();}}publicintgetState(){returnmState;}publicvoidsetState(intstate){mState=state;notifyChange();}}12345678910111213141516171819202122232425262728293031323334353637383940最后我们来写测试类FirstActivity:packagecn.daming.observer.design;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importcom.daming.designtraning.R;publicclassFirstActivityextendsActivity{