模式定义
定义对象间的一对多的依赖关系,使每当一个对象发生变化时,所依赖它的对象都会得到通知并被自动更新.
使用场景
- 多事件触发场景
- 跨进程消息交换场景,如EventBus消息处理机制
观察者模式.pngUML类图
- Subject : 抽象被观察者,将所有观察者的引用保存到一个集合; 即每个被观察者都可以有任意数量的观察者.
- CustomSuject : 抽象被观察者的具体实现类.将有关状态存储入具体的观察者对象;当内部状态发生变化时将会给所有的观察者发出状态更新通知.
- Observe : 抽象观察者,定义数据更新接口,作用是在得到被观察者发来的状态更新通知后及时更新自己的状态.
- CustomObserver : 抽象观察者的具体实现类,实现抽象观察者定义的更新接口具体操作.
实例 Demo
服务员是观察者
/**
* @FileName: org.greenrobot.eventbusperf.observer
* @Date: 2018/12/23 15:27
* 服务员是观察者
**/
public class Waiter implements Observer {
public String name;
public Waiter(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(arg +" 菜名:" + name);
}
}
饭店为被观察者,当被观察者发生改变时所有的观察者都会接到相应通知
/**
* @FileName: org.greenrobot.eventbusperf.observer
* @Author: ShiChuang
* @Date: 2018/12/23 18:33
* 饭店是被观察者,当它有更新时所有的观察者都会接到相应通知
**/
public class Hotel extends Observable {
public void postNewInfo(String content) {
setChanged();
notifyObservers(content);
}
}
主程序
public class Test {
public static void main(String[] args) {
Hotel hotel = new Hotel();
//观察者
Waiter waiter0 = new Waiter("黄焖鸡");
Waiter waiter1 = new Waiter("拍黄瓜");
Waiter waiter2 = new Waiter("炒腐竹");
Waiter waiter3 = new Waiter("炒鸡蛋");
Waiter waiter4 = new Waiter("凉 皮");
hotel.addObserver(waiter0);
hotel.addObserver(waiter1);
hotel.addObserver(waiter2);
hotel.addObserver(waiter3);
hotel.addObserver(waiter4);
hotel.postNewInfo("上菜了!");
}
}
优点
- 解耦和,对应业务变化
- 增强应用灵活性和可扩展性
缺点
- 使用此模式时需要考虑开发效率和运行效率
- 开发和调试会比较复杂
- Java中消息通知时当一个观察者出现卡顿会影响整体执行效率(若遇到此种情况时一般采用异步处理方式)
总结
- 观察者模式主要作用就是对象解耦,将观察者与被观察者完全隔离.
网友评论