前言
最近在做IM即时通讯语音录制发送这个模块的时候,用到了观察者模式,因此结合书上内容在加深了一遍,不得不说观察者模式是一个使用率非常高的模式.
定义
- 定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
- 作用:将观察者和被观察者解耦.最常用在GUI系统,订阅-发布系统.笔者遇到的场景是聊天语音播放和控制.
- 应用场景:关联行为场景,多级触发场景,系统的消息交换场景;
UML类图
Subject:被观察者
/**
* 被观察者 接口
* 作用: 提供增删,通知观察者的方法
* @author max
* @date 2016年2月17日
*
*
*/
public interface Subject {
//增
void addObserver(Observer observer);
//删
void deleteObserver(Observer observer);
//通知--这里可以自己根据实际业务需求,传递参数,通知所有观察者要做的事
void notifyObserver();
}
ConcreteSubject:具体被观察者
/**
* 具体被观察者,
* 作用:1.实现Subject接口 2.保存所有观察者对象
* @author max
* @date 2016年2月17日
*
*/
public class ConcreteSubject implements Subject{
private List<Observer> list = new ArrayList<>();
@Override
public void notifyObserver() {
if (list != null && list.size() > 0) {
//遍历所有观察者,接收通知,实现具体业务逻辑
for (Observer observer : list) {
observer.update();
}
}
}
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
list.remove(observer);
}
}
Observer:观察者,
/**
* 观察者接口
* 作用:提供update方法,收到被观察者通知,实现具体业务
* @author max
* @date 2016年2月17日
*
*/
public interface Observer {
void update();
}
ConcreteObserver:具体观察者.
/**
* 具体观察者,实现业务逻辑
* @author max
* @date 2016年2月17日
*
*/
public class ConcreteObserver implements Observer{
@Override
public void update() {
//根据自己业务需求,写观察者收到被观察者变化的业务逻辑代码
}
}
具体使用场景:拟被观察者Subject发生变化,所有观察者接收到通知,实现所有观察者update()业务过程
/**
* 模拟被观察者Subject发生变化,所有观察者接收到通知,实现其业务过程
*/
private void simple() {
//被观察者
Subject subject = new ConcreteSubject();
//所有观察者
Observer observer1 = new ConcreteObserver();
Observer observer2 = new ConcreteObserver();
Observer observer3 = new ConcreteObserver();
Observer observer4 = new ConcreteObserver();
//加入到所有观察者集合里面去
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.addObserver(observer3);
subject.addObserver(observer4);
//被观察者状态发生改变,通知所有观察者,所有观察者执行update()方法,会分别取执行4个具体observer的update()方法
subject.notifyObserver();
}