观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
应用场景:
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息,比如天气预报,推送消息
类的结构图:
下面我们按照这个类图的结构简单实现一个天气预报的观察者模式
package com.example.demo; /** * 观察者接口 * * @author:liuwenjun * @version:1.0 * @date: 2018/4/5 */ public interface Observer { void update(String message); }
package com.example.demo; /** * 天气观察者 * * @author:liuwenjun * @version:1.0 * @date: 2018/4/5 */ public class WeatherObserver implements Observer { private String name; public WeatherObserver(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + "收到了天气变化消息:" + message); } }
package com.example.demo; /** * 主题 * * @author:liuwenjun * @version:1.0 * @date: 2018/4/5 */ public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver(); }
package com.example.demo; import java.util.ArrayList; import java.util.List; /** * 天气主题 * * @author:liuwenjun * @version:1.0 * @date: 2018/4/5 */ public class WeatherSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String message; @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { if (!observers.isEmpty()) { observers.remove(observer); } } @Override public void notifyObserver() { //JAVA8 lambda语法 observers.forEach(observer -> observer.update(message)); } public void setWeatherInfo(String message) { this.message = message; notifyObserver(); } public static void main(String[] args) { Observer observer = new WeatherObserver("北京朝阳区气象站"); WeatherSubject weatherSubject = new WeatherSubject(); weatherSubject.registerObserver(observer); weatherSubject.setWeatherInfo("阳春四月,北京又下雪了,雪债雪偿。"); } }