先举个小例子,差不多就了解观察者模式是什么玩意了
比如有一个天气数据中心,
有2个app(如墨迹天气、天气预报)的数据都是订阅这个数据中心的
当天气数据中心得到最新的天气情况,就会触发一个通知,通知所有的观察者,即上文说的墨迹天气、天气预报
这时候又来了一个新的天气app,比如某手机内置天气软件,也要订阅这个数据中心,因此数据中心需要提供注册观察者的功能
同样也需要提供移除某观察者的能力,比如某软件觉得数据中心的天气数据不靠谱,花大成本自己来做,不用数据中心的
首先需要一个主题接口,被观察者
/**
* @author wmx
* @date 2019-09-16
*/
public interface Subject {
/**
* 注册观察者
*
* @param
* @return
* @throws
*/
void registerObserver(Observer observe);
/**
* 解除绑定观察者
*
* @param
* @return
* @throws
*/
void unRegisterObserver(Observer observe);
/**
* 通知观察者
*
* @param
* @return
* @throws
*/
void notifyObservers(String msg);
}
天气数据中心
/**
* 天气
*
* @author wmx
* @date 2019-09-16
*/
@Data
public class WeatherData implements Subject{
private List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer observe) {
observers.add(observe);
}
@Override
public void unRegisterObserver(Observer observe) {
observers.remove(observe);
}
@Override
public void notifyObservers(String msg) {
observers.forEach(e->{
e.update(msg);
});
}
}
观察者
/**
* 观察者
*
* @author wmx
* @date 2019-09-16
*/
public interface Observer {
void update(String msg);
}
具体观察者
/**
* 墨迹天气
*
* @author wmx
* @date 2019-09-16
*/
public class MojitianqiObserver implements Observer{
@Override
public void update(String msg) {
System.out.println("墨迹天气接收天气变化信息:" + msg );
}
}
/**
* 天气预报
*
* @author wmx
* @date 2019-09-16
*/
public class TianqiyubaoObserver implements Observer{
@Override
public void update(String msg) {
System.out.println("天气预报接收天气变化信息:" + msg );
}
}
/**
* @author wmx
* @date 2019-09-16
*/
public class Main {
public static void main(String[] args) {
//被观察者
WeatherData weatherData = new WeatherData();
//观察者
MojitianqiObserver mojitianqiObserver = new MojitianqiObserver();
TianqiyubaoObserver tianqiyubaoObserver = new TianqiyubaoObserver();
List<Observer> observers = weatherData.getObservers();
observers.add(mojitianqiObserver);
observers.add(tianqiyubaoObserver);
//数据变更,通知观察者
weatherData.notifyObservers("9月16日 晴 18度-26度");
observers.remove(tianqiyubaoObserver);
weatherData.notifyObservers("9月17日 阴 16度-24度");
}
}
输出:
墨迹天气接收天气变化信息:9月16日 晴 18度-26度
天气预报接收天气变化信息:9月16日 晴 18度-26度
墨迹天气接收天气变化信息:9月17日 阴 16度-24度
观察者模式差不多就是这个意思了
其实也不用手写观察者模式
JDK内部已经内置了观察者模式的实现
java.util.Observable
java.util.Observer
具体用法百度一大堆
观察者模式通用类图:
后面可以研究下一些框架中哪些地方用到观察者模式
印象中Spring 中用到的挺多
TODO项还是很多的
说点什么
您将是第一位评论人!