观察者模式定义了对象间的一种一对多的组合关系,即一个被观察者可以对应多个观察者,当被观察者状态发生变化的时候,所有依赖于它的观察者都将收到通知并自动更新
实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——取消注册”的形式,如EventBus,RxJava都是使用观察者模式实现的
名词解析
Subject、Observable:被观察者
Subscriber、Observer:观察者
实现观察者模式
这里以乔布斯的苹果公司和使用iphone手机的消费者举例,苹果公司好比是被观察者,消费者是观察者,每当苹果公司需要让手机系统更新时,都会自动通知持有iphone手机的消费者
代码示例
定义被观察者接口和被观察者实现类
/**
* Created by yunzhao.liu on 2017/12/27
* 被观察者接口
*/
public interface Subject {
/**
* 注册观察者
* @param o 观察者
*/
void registerObserver(Observer o);
/**
* 取消注册观察者
* @param o 观察者
*/
void unregisterObserver(Observer o);
/**
* 通知所有观察者
*/
void notifyObservers(String info);
}
/**
* Created by yunzhao.liu on 2017/12/27
* 被观察者实现类
*/
public class AppleIncSubject implements Subject {
//用来存放观察者
private ArrayList<Observer> list = new ArrayList<>();
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void unregisterObserver(Observer o) {
list.remove(o);
}
@Override
public void notifyObservers(String info) {
for (Observer o : list) {
o.update(info);
}
}
/**
* 更新版本信息
*/
public void updateVertion(String info) {
this.notifyObservers(info);
}
}
定义观察者接口和观察者实现类
/**
* Created by yunzhao.liu on 2017/12/27
* 观察者接口
*/
public interface Observer {
/**
* 每个观察者都需要实现该方法
* 当被观察者状态发生改变时,通知每个观察者去更新
*
* @param info 更新信息
*/
void update(String info);
}
/**
* Created by yunzhao.liu on 2017/12/27
* 观察者实现类
*/
public class ConsumerObserver implements Observer{
//消费者姓名
private String name;
public ConsumerObserver(String name) {
this.name = name;
}
@Override
public void update(String info) {
System.out.println(name+"已更新版本到:"+info);
}
}
执行类
/**
* Created by yunzhao.liu on 2017/12/27
*/
public class TestChange {
public static void main(String[] args) {
AppleIncSubject subject = new AppleIncSubject();
ConsumerObserver observer1 = new ConsumerObserver("小明");
ConsumerObserver observer2 = new ConsumerObserver("小芳");
ConsumerObserver observer3 = new ConsumerObserver("小红");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.registerObserver(observer3);
subject.updateVertion("1.1.1");
}
}
在观察者模式中,又分为推模型和拉模型两种方式。上面的例子就是典型的推模型,即向观察者推送详细信息,而拉模型是向观察者推送少量信息,更具体的信息则由观察者自己去被观察者对象中去取,一般会把被观察者推送给观察者。
以上就是观察者模式的简单使用,当然真实使用中还需要考虑多线程同步等问题。