观察者模式
现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能导致一个或者多个对象的行为随之发生改变。例如,微信公众号与微信用户,气象局的天气预报与听众等等。
定义
观察者模式定义了多个对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并被自动更新。这种模式又称发布-订阅模式、模型-视图模式,是一种对象行为型模式。
观察者模式的主要结构:
1.抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
2.具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
3.抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
4.具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
UML类图
使用场景
在软件系统中,当系统一方行为依赖另一方行为的变动时,可使用观察者模式松耦合联动双方,使得一方的变动可以通知到感兴趣的另一方对象,从而让另一方对象对此做出响应。
观察者模式适合以下几种情形:
1.对象间存在一对多关系,一个对象的状态发生改变会影响其他对象
2.当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用
3.实现类似广播机制的功能,不需要知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播
4.多层级嵌套使用,形成一种链式触发机制,使得事件具备跨域(跨越两种观察者类型)通知
示例
发布者接口
/**
* 主题/发布者接口
*/
public interface Subject {
// 注册观察者
void registerObserver(Observer o);
// 删除观察者
void removeObserver(Observer o);
// 通知观察者
void notifyObserver();
}
具体发布者
/**
* 天气预报主题/发布者
*/
public class WeatherData implements Subject {
// 注册的观察者集合
private ArrayList<Observer> observers;
// 温度
private float temperature;
// 湿度
private float humidity;
// 压强
private float pressure;
/**
* 无参构造器
*/
public WeatherData(