观察者模式

设计原则:

1.为了交互对象之间的松耦合设计而努力

观察者模式:

定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新

场景:
气象站需要实时监控数据,数据发生变动的时候就会把参数传递给各个布告板,各个布告板也会有自己的实现方式,同时有可能会添加多个布告板,或者移除布告板
各个对象之间的关系:


观察者模式_第1张图片
image.png

如图所示我们需要的接口和实现类


观察者模式_第2张图片
image.png

1.被观察者
接口Subject.java

public interface Subject {
    /**
     *  @功能:添加观察者
     *  @作者:jh @代号:金花
     *  @时间:2018年7月31日  
     */
    void registerObserver(Observer o);

    /**
     *  @功能:移除观察者
     *  @作者:jh @代号:金花
     *  @时间:2018年7月31日  
     */
    void removeObserver(Observer o);

    /**
     *  @功能:调用方法
     *  @作者:jh @代号:金花
     *  @时间:2018年7月31日  
     */
    void notifyObservers();
}

实现类WeatherData2.java

public class WeatherData2 implements Subject {

    private List obs = new ArrayList<>();
    private String temperature;
    private String humidity;
    private String pressure;

    public String getTemperature() {
        return temperature;
    }

    public String getHumidity() {
        return humidity;
    }

    public String getPressure() {
        return pressure;
    }

    public void setTemperature(String temperature) {
        this.temperature = temperature;
    }

    public void setHumidity(String humidity) {
        this.humidity = humidity;
    }

    public void setPressure(String pressure) {
        this.pressure = pressure;
    }

    public void measurementsChanged() {
        notifyObservers(); // 调用
    }

    @Override
    public void notifyObservers() {
        // TODO Auto-generated method stub
        for (Observer observer : obs) {
            observer.update(this);
        }
    }

    @Override
    public void registerObserver(Observer o) {
        // TODO Auto-generated method stub
        obs.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        // TODO Auto-generated method stub
        obs.remove(o);
    }

}

2.观察者
接口Observer.java

public interface Observer {
    void update(Subject s);
}

实现类CurrentConditionsDisplay.java
DisplayElement接口可有可无

public class CurrentConditionsDisplay implements DisplayElement,Observer{


    /**
     *  @功能:显示天 气预报 
     *  @作者:jh @代号:金花
     *  @时间:2018年7月31日  
     */
    @Override
    public void display(WeatherData2 wd2) {
        // TODO Auto-generated method stub
        Console.json(wd2);
    }

    @Override
    public void update(Subject s) {
        // TODO Auto-generated method stub
        if(s instanceof WeatherData2) {
            WeatherData2 wd2 = (WeatherData2) s;
            Console.json(wd2);
        }
    }

}

3.测试类

public class Test2 {
    public static void main(String[] args) {
        WeatherData2 wd2 = new WeatherData2();
        wd2.setHumidity("35C");
        wd2.setPressure("ppp");
        wd2.setTemperature("mm");
        
        Observer one = new CurrentConditionsDisplay();
        Observer two = new ForecastDisplay();
        Observer three = new StatisticsDisplay();
        Observer four = new ThirdPartyDisplay();
        wd2.registerObserver(one);
        wd2.registerObserver(two);
        wd2.registerObserver(three);
        wd2.registerObserver(four);
        
        wd2.notifyObservers();
        
        Console.log("=======================");
        
        wd2.removeObserver(one);
        wd2.notifyObservers();
    }
}

运行结果


观察者模式_第3张图片
image.png

你可能感兴趣的:(观察者模式)