定义:对象之间多对一的关系时的设计方案, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
场景:订阅报刊业务的场景。
原理:Subject 具有登记注册观察者、移除观察者和通知观察者的三个核心方法。 观察者一个核心行为方法:给Subject通知观察者调用的方法。
由Subject来通知和调用注册进来的观察者的行为方法。
优点:
1.以集合的方式来管理依赖对象(Observer),三个核心方法:注册、移除和通知观察者。
2.遵守OCP原则,增加观察者时只需要增加Observer而不用修改核心代码。
源码:jdk的Observable使用到观察者模式
案例:
package shangguigu_designmode.observer_mode;
/**
* 主题:有三个核心方法,注册观察者、移除观察者和通知观察者
* */
public interface Subject {
//注册观察者
public void registerObserver(Observer observer);
//移除观察者
public void remove(Observer observer);
//通知观察者
public void notifyObserver();
}
/**
*
* 实现主题类,里面有三个属性:温度temperature 压力pressure 湿度humidity 来表示当前气象数据
* 1.包含当天的天气情况
* 2.观察者的集合使用ArrayList管理
* 3.当数据有更新时,主动调用,让接入方看到最新的消息
* */
public class WeatherData implements Subject{
//温度
private float temperature;
//压力
private float pressure;
//湿度
private float humidity;
//观察者集合
ArrayList<Observer> observers = new ArrayList<Observer>();
//一次性设置数据
public void setData(float temperature,float pressure,float humidity){
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
dataChange();
}
public float getTemperature