05 观察者模式 Observer

群体广播信息时, 就可以用到观察者模式

生产者(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);

    }

}

 

posted @ 2020-03-21 18:00  神之一招  阅读(277)  评论(0编辑  收藏  举报