群体广播信息时, 就可以用到观察者模式
生产者(WeatherData天气变化) -> 服务方法(WeatherData, 理解为气象站) -> 观察者(订阅者Observer)(用一个列表维护当前的观察者)
天气预报举例: 气象站检测, 然后通过公告发布出去
需要一个开放性的 API, 便于第三方获取
测量数据实时更新,并通知第三方
对象:
生产者, 为了简化模式, 这里把生产者模拟放到了气象站里, 实际上正常来说, 应该还有个生产者列表, 生产出不同的topic, 订阅者订阅的也是不同的topic.
气象站, WeatherData, 提供注册和取消关注的方法给到观察者, 并且提供 notify 给到所有的观察者最新的气象变化
观察者, Observer, 接收最新的天气变化, 并显示.
package com.leon.design; public interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObservers(); } package com.leon.design; public interface Observer { void update(int temp); void display(); } package com.leon.design; import java.util.ArrayList; public class WeatherData implements Subject { private int temperature; ArrayList<Observer> observer; public WeatherData() { observer = new ArrayList<Observer>(); } public void setTemperature(int temperature) { this.temperature = temperature; doChange(); } public void doChange() { notifyObservers(); } @Override public void registerObserver(Observer o) { observer.add(o); } @Override public void removeObserver(Observer o) { if (observer.contains(o)) { observer.remove(o); } } @Override public void notifyObservers() { for (int i = 0; i < observer.size(); i++) { observer.get(i).update(this.temperature); } } } package com.leon.design; public class Sina implements Observer { private int temp; @Override public void update(int temp) { this.temp = temp; display(); } @Override public void display() { System.out.println("Sina boradcast: the temperature is" + this.temp + "."); } } package com.leon.design; public class Baidu implements Observer { private int temp; @Override public void update(int temp) { this.temp = temp; display(); } @Override public void display() { System.out.println("Baidu boradcast: the temperature is" + this.temp + "."); } } package com.leon.design; public class ObserverClient { public static void main(String[] args) { WeatherData weather = new WeatherData(); Observer sina = new Sina(); Observer baidu = new Baidu(); // 注册 weather.registerObserver(sina); weather.registerObserver(baidu); weather.setTemperature(100); } }