概念
定义对象间的一种一(Observable)对多(Observer)的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
举个例子,一个程序员在搞开发(被观察者),后面一群产品,测试,UI,运营(观察者们)在盯着,程序员一旦完成了开发,其他人就都知道了,并且开始完成后期任务。
观察者模式,字面意思是被观察者做自己的事儿,观察者们就在旁边看,看着做完了就做出一定的反应,但是实际在程序中,我们不是这么用的,观察者如果时时刻刻都在盯着被观察者,多累呀,一般都是使用的发布-订阅模式,就是说程序员自己开发自己的功能,其他想要关心进度的人就提前告诉程序员一声,程序员把功能开发好了,再挨个通知,功能开发完了,其他订阅者(观察者)再做出响应,啊,程序员真是累呀!
献上简易demo
具体的代码实现上面需要两个接口,一个是被观察者接口,一个是观察者接口,这样便于扩展,解耦。
/**
* 被观察者接口
*/
public interface Observable {
//添加观察者
void attach(Observer observer);
//删除观察者
void detach(Observer observer);
//通知所有的观察者
void notifyObservers();
}
/**
* 观察者接口
*/
public interface Observer {
//更新
void update();
}
/**
* 被观察者实现类(苦逼的程序员)
*/
public class Programmer implements Observable {
private List<Observer> observers = new ArrayList<>();
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
public void change(){
Log.i("huan","程序员:功能终于开发完啦,哈哈哈哈");
notifyObservers();
}
@Override
public void notifyObservers() {
for(Observer observer:observers){
observer.update();
}
}
}
/**
* 观察者实现类(产品经理)
*/
public class PMObserver implements Observer{
@Override
public void update() {
Log.i("huan","产品:额,我这里想加个需求,哪里也要加个功能");
}
}
/**
* 观察者实现类(测试)
*/
public class QAObserver implements Observer {
@Override
public void update() {
Log.i("huan","测试:你这个功能一定有bug,你看点这里没有反应。。。");
}
}
/**
* 观察者实现类(运营)
*/
public class OPObserver implements Observer {
@Override
public void update() {
Log.i("huan","运营:我要去给用户瞎掰新功能了");
}
}
Programmer programmer = new Programmer();
QAObserver qa = new QAObserver();
PMObserver pm = new PMObserver();
OPObserver op = new OPObserver();
programmer.attach(qa);
programmer.attach(pm);
programmer.attach(op);
programmer.change();
log输出
代码非常简单
观察者模式的优缺点
优点:解耦,观察者双方都依赖于接口,双方的扩展和变化都不相互影响。
缺点:运行效率有影响,一般情况下java使用的是顺序执行,一旦一行代码死循环下面的代码就都无法执行,所以这里需要做异步处理。
Android中的观察者模式
使用的太多,这里就举一些简单的例子,所有控件的事件监听(OnClickListener)就是使用观察者模式实现的,广播(BroadcastReceiver)。