1.概述
观察者模式最常用的地方是GUI系统、订阅-发布系统。观察者模式的一个重要作用就是解耦,将观察者和被观察者解耦,使得他们之间的依赖性更小。
2.定义
定义对象间的一种一对多依赖关系,使得每当一个对象改变状态时,所有依赖他的对象都会得到通知并自动更新。
3.简单的代码实现
观察者
public class MyObserver implements Observer { public String name; public MyObserver(String name){ this.name=name; } @Override public void update(Observable observable, Object o) { System.out.println("Hi,标记下哦"+name+"更新内容:"+o.toString()); } @Override public String toString() { return "观察者姓名:"+name; } }
被观察者
public class MyObservable extends Observable{ public void postNew(String content){ /** * 标示状态或内容发生改变 */ setChanged(); notifyObservers(content); } }
实现
MyObservable myObservable=new MyObservable(); MyObserver myObserver1=new MyObserver("观察者1"); MyObserver myObserver2=new MyObserver("观察者2"); myObservable.addObserver(myObserver1); myObservable.addObserver(myObserver2); myObservable.postNew("这里是更新的内容哦");
运行后会打印:
Hi,标记下哦观察者1更新内容:这里是更新的内容哦
Hi,标记下哦观察者2更新内容:这里是更新的内容哦
4.Observer Observable
两则都是JDK的内置类型,在以上中Observer是抽象观察者角色,Obsevable是抽象主题,而MyObserver,是具体观察者,MyObservable是具体主题。 MyObserver订阅MyObservable主题后,当MyObservable更新时,会遍历所有的MyObserver,发生通知。在整个的通知系统中是通过Observer和Observable完成的,MyObserver和MyObservable完全没有耦合,保证了订阅的灵活性和可扩展性。
5.EventBus简单使用 (EventBus 也是使用的订阅,观察者模式)
下载地址 https://github.com/greenrobot/EventBus
注册
EventBus.getDefault().register(this);
解除注册
protected void onDestroy(){ super.onDestroy(); EventBus.getDefault().unregister(this); }
接受事件 3.0需要加入
@Subscribe
方法名
onEventMainThread 可以自定义了。
@Subscribe public void onEventMainThread(ItemBean itemBean){ textView.setText(itemBean.msg); Log.d("harvic", "onEventMainThread收到了消息:" + itemBean.getMsg()); }
发送事件
EventBus.getDefault().post(new ItemBean("我的EventBus"));