天天看點

學習筆記【23種設計模式-第十七節:Observe 觀察者模式】Observe 觀察者模式

Observe 觀察者模式

簡述:

  • 觀察者模式類似于訂牛奶業務:① 奶站:Subject;② 使用者:Observer。
  • Subject:登記注冊、移除和通知:①registerObserver 注冊;② removeObserver 移除; ③ notifyObservers 通知所有的注冊使用者,根據不同需求,可以是更新資料,讓使用者來取,也可以是實施推送,看具體需求定。
  • Observer:接受輸入
  • 觀察者模式:對象之間多對一依賴的一種設計方案,被依賴的對象為Subject,依賴的對象為Observer,Subject通知Observer變化,比如這裡的奶站是Subject,是一的一方,使用者是Observer,是多的一方。

例子

天氣預報:一個接口Subject,有registerObserver方法(傳入Observer參數),還有一個remove方法(Observer參數),還有一個notifyObservers方法。有一個WeatherData類實作了Subject,有一個集合ArrayList< Observer >。有一個Observer接口,其中有個update方法,有CurrentCondition實作它。

Subject接口:

public interface Subject {
    public void registerObserver(Observer o);

    public void removeObserver(Observer o);

    public void notifyObserver();
}

           

Observer接口:

public interface Observer {
    public void update(float temperature,float pressure,float humidity);
}
           

CurrentCondition類:

public class CurrentCondition implements Observer{
    private float temperature;
    private float pressure;
    private float humidity;
    @Override
    public void update(float temperature, float pressure, float humidity) {
        this.temperature=temperature;
        this.pressure=pressure;
        this.humidity=humidity;
        display();
    }

    public void display(){
        System.out.println("****Today temperature ="+temperature+"****");
        System.out.println("****Today pressure ="+pressure+"****");
        System.out.println("****Today humidity ="+humidity+"****");
    }
}
           

WeatherData類:

public class WeatherData implements Subject{
    private float temperature;
    private float pressure;
    private float humidity;
    private ArrayList<Observer> observers;

    public void dataChange(){
        notifyObserver();
    }
    public void setData(float temperature,float pressure,float humidity){
        this.temperature=temperature;
        this.pressure=pressure;
        this.humidity=humidity;
        dataChange();
    }

    public WeatherData() {
        observers=new ArrayList<>();
    }

    public float getTemperature() {
        return temperature;
    }

    public float getPressure() {
        return pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        if (observers.contains(o)) observers.remove(o);
    }

    @Override
    public void notifyObserver() {
        for (int i=0;i<observers.size();i++){
            observers.get(i).update(temperature,pressure,humidity);
        }
    }
}
           

Client主方法:

public class Client {
    public static void main(String[] args) {
        WeatherData weatherData=new WeatherData();
        CurrentCondition currentCondition=new CurrentCondition();
        weatherData.registerObserver(currentCondition);
        weatherData.setData(10,100,40);
    }
}
           

觀察者模式的好處

  • 觀察者模式設計後,會議集合的方式來管理使用者(Observer),包括注冊,移除和通知。
  • 這樣,我們增加觀察者(這裡可以了解成一個新的公告闆),就不需要去修改核心類WeatherData,遵守了OCP原則。