情景1
有一种短信服务,比如天气预报服务,一旦你订阅该服务,你只需按月付费,付完费后,每天一旦有天气信息更新,它就会及时向你发送最新的天气信息。
1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
/** * 我们来使用一下,我们定义了一个天气变换的主题,也就是被观察者,还有两个观察者观察天气变换,一旦变换了,就打印出天气信息, * 注意一定要调用被观察者的register进行注册,否则会收不到变换信息。 * 而一旦不敢兴趣了,直接调用unregister方法进行取消注册即可 */ public void ObserverTest(){ //天气预报 Observable<Weather> observable=new Observable<Weather>(); Observer<Weather> observer1=new Observer<Weather>() { @Override public void onUpdate(Observable<Weather> observable, Weather data) { System.out.println("观察者1:"+data.toString()); } }; Observer<Weather> observer2=new Observer<Weather>() { @Override public void onUpdate(Observable<Weather> observable, Weather data) { System.out.println("观察者2:"+data.toString()); } }; //注册观察者 observable.register(observer1); observable.register(observer2); //天气发生了改变,通知观察者,注册了的观察者就能收到相应的信息 Weather weather=new Weather("晴转多云"); observable.notifyObservers(weather); Weather weather1=new Weather("多云转阴"); observable.notifyObservers(weather1); observable.unregister(observer1); Weather weather2=new Weather("台风"); observable.notifyObservers(weather2); }
/** * Created by Administrator on 2017/9/13. * 封装业务,观察者和被观察者的业务封装 * 观察者:注册监听,谁注册谁能收到 * 被观察者:有信息变化的时候通知观察者 * */ public class Observable <T>{ List<Observer<T>> mObservers = new ArrayList<Observer<T>>(); //注册 public void register(Observer<T> observer) { if (observer == null) { throw new NullPointerException("observer == null"); } synchronized (this) { if (!mObservers.contains(observer)) mObservers.add(observer); } } /**反注册*/ public synchronized void unregister(Observer<T> observer) { mObservers.remove(observer); } public void notifyObservers(T data) { for (Observer<T> observer : mObservers) { observer.onUpdate(this, data); } } }
/** * Created by Administrator on 2017/9/13. * 观察者得到的更新接口 */ public interface Observer <T> { void onUpdate(Observable<T> observable,T data); }
public class Weather { public Weather(String description){ this.description=description; } private String description; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
总结:
1.观察者(封装更新方法)
2.被观察者———转接桥梁(封装了注册和更新的方法)
3.事件(实体信息,内容)
4.观察者模式的三个典型方法它都具有,即注册,取消注册,发送事件
5.传输数据,有注册信息相关的组件就用到了观察者模式
安卓中用到的观察者模式
1.观察者模式:
电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。
比如说BaseAdapter AbsListView
我们可以通过BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver两方法来向BaseAdater注册、注销一个DataSetObserver。这个过程中,DataSetObserver就是一个观察者,它一旦发现BaseAdapter内部数据有变量,就会通过回调方法DataSetObserver.onChanged和DataSetObserver.onInvalidated来通知DataSetObserver的实现类。事件通知也是观察者模式
简介:一个对象发生改变时,所有信赖于它的对象自动做相应改变。
2.Android的广播机制LocalBroadcastManager
我们平时使用本地广播主要就是下面四个方法
LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(BroadcastReceiver receiver, IntentFilter filter);
localBroadcastManager.unregisterReceiver(BroadcastReceiver receiver);
localBroadcastManager.sendBroadcast(Intent intent)
3.EventBus
观察者模式的三个典型方法它都具有,即注册,取消注册,发送事件
EventBus.getDefault().register(Object subscriber);
EventBus.getDefault().unregister(Object subscriber);
EventBus.getDefault().post(Object event);