首先先来介绍一下什么是观察者模式:
观察者模式是一种行为型模式,也被叫做发布/订阅模式,其内容就是通过定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式主要解决的就是在易用和低耦合的前提下实现对象状态的同步。其实这种设计模式在Android下运用早已十分广泛,如控件的监听、数据与UI的同步、Broadcast以及其他一些框架RxJava、EventBus、otto等,之后有时间的话我会单独写篇博客对Android系统源码中的观察者模式进行分析。
现实生活中,类似于观察者模式的例子也很多,比如天气推送、杂志订阅、快递领取等,这里我模拟快递领取实现一个观察者模式,代码如下:
一、 首先创建抽象观察者
//定义一个接口,接口中定义收件人收到通知后的反应函数:
public interface Observer {//抽象观察者
public void update(String message);
}
二、 创建具体观察者
//这里创建了两个观察者,Boy和Girl
public class Boy implements Observer {
private String name;//名字
public Boy(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + ",收到了信息:" + message+"自己去取快递.");
}
}
public class Girl implements Observer {
private String name;//名字
public Girl(String name) {
this.name = name;
}
@Override
public void update(String message) {//女孩的具体反应
System.out.println(name + ",收到了信息:" + message+"让男朋友去取快递~");
}
}
三、 创建抽象被观察者(或者说抽象主题),同样是通过接口实现
public interface Observable {//抽象被观察者
void add(Observer observer);//添加观察者
void remove(Observer observer);//删除观察者
void notify(String message);//通知观察者
}
四、 创建具体被观察者
public class Postman implements Observable{//快递员
private List<Observer> personList = new ArrayList<Observer>();//保存收件人(观察者)的信息
@Override
public void add(Observer observer) {//添加收件人
personList.add(observer);
}
@Override
public void remove(Observer observer) {//移除收件人
personList.remove(observer);
}
@Override
public void notify(String message) {//逐一通知收件人(观察者)
for (Observer observer : personList) {
observer.update(message);
}
}
}
OK ,接下来我们来测试一下我们的观察者模式:
public void test(){
Observable postman = new Postman();
Observer boy1 = new Boy("小明");
Observer boy2 = new Boy("小华");
Observer girl1 = new Girl("小红");
postman.add(boy1);
postman.add(boy2);
postman.add(girl1);
postman.notify("快递到了,请下楼领取.");
}
执行结果:
小明,收到了信息:快递到了,请下楼领取.自己去取快递.
小华,收到了信息:快递到了,请下楼领取.自己去取快递.
小红,收到了信息:快递到了,请下楼领取.让男朋友去取快递~
从执行结果可以看出达到了我们的设计要求,即将对象的状态更新进行通知。并且,从代码中我们可以看到,这里的Boy类和Girl类与Postman类之间并无直接依赖关系,也就是说观察者模式实现了一种依赖关系的弱化。但是虽然代码中Boy类和Girl类与Postman类无直接依赖,但Observable和Observer(即抽象主题与抽象观察者)之间依然存在依赖,即观察者模式通过面向对象的思想解除了原本观察者与被观察者之间的耦合,使得二者均依赖于抽象(这里就是代码中的接口),这也就实现了对于依赖关系的弱化。除此之外,观察者模式很容易扩展,比如这里快递领取人数需要增加时,只需要调用add方法即可,不需要更改其他代码,这也是解耦的好处之一。