设计模式(3)------观察者设计模式(jdk自带)

一:原理就是观察者设计模式的原理直接上图和代码

 WeatherData(主题接口实现)

 1 public class WeatherData extends Observable {
 2     private float temperature;
 3     private float humidity;
 4     private float pressure;
 5  
 6     public WeatherData() {
 7     }
 8  
 9     public void measurementsChanged() {
10         setChanged();
11         notifyObservers();
12     }
13  
14     public void setMeasurements(float temperature, float humidity, float pressure) {
15         this.temperature = temperature;
16         this.humidity = humidity;
17         this.pressure = pressure;
18         measurementsChanged();
19     }
20  
21     public float getTemperature() {
22         return temperature;
23     }
24  
25     public float getHumidity() {
26         return humidity;
27     }
28  
29     public float getPressure() {
30         return pressure;
31     }
32 }

isplayElement.java(展示接口)

public interface DisplayElement {

public void display();

}

CurrentConditionsDisplay.java(观察者实现类)

package com.DesignPatterns.ab.observer2;

import java.util.Observable; import java.util.Observer;

public class CurrentConditionsDisplay implements Observer, DisplayElement { Observable observable;

private float temperature;

private float humidity;

public CurrentConditionsDisplay(Observable observable) {

this.observable = observable;

observable.addObserver(this);

}

public void update(Observable obs, Object arg) {

if (obs instanceof WeatherData) {

WeatherData weatherData = (WeatherData) obs;

this.temperature = weatherData.getTemperature();

this.humidity = weatherData.getHumidity();

display();

}

}

public void display() {

System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");

}

}

Test.java(测试)

  • @date 2018年9月20日 对比见精髓: 一,注册和上面的差不多,只不多是接口改成抽象类了 二,主题修改通知观察者
  • 现在观察者已经注册完毕了,现在我们调用主题的实现类里面的参数修改的方法,修改会调用统一定义的方

法(update),

  • 只不过这个时候update的方法不在主题的实现类中了而是在主题的抽象类(父类)中,因为上面对的例子我们是实现的是接口
  • ,而这里我们继承的是抽象类,观察者现在全部都在list中,
  • 所以这个时候我们可以直接调用观察者的统一定义的方法来实现通知观察者的目的了 ,而参数我们可以通过this关键字,
  • 就是主题实现类,把参数传过去了。

    *

    *

  • 1,总上所述就是注册,在主题的list中放入观察者,
  • 2,然后假如主题发生变化,会从list中取出观察者并根据统一定义的方法(update)来通知观察者。

    */

    public class Test {

    @SuppressWarnings("unused")

    public static void main(String[] args) {

    WeatherData weatherData = new WeatherData();

    // 这里是依赖者

    // 这一行相当于注册,通过构造方法

    CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);

    /*

  • 建立三个布告板,并把WeatherData对象传给它们。

    */

    // 主题变化,weatherData变化通知CurrentConditionsDisplay,StatisticsDisplay,ForecastDisplay发生变化

    weatherData.setMeasurements(80, 65, 30.4f);

    weatherData.setMeasurements(82, 70, 29.2f); weatherData.setMeasurements(78, 90, 29.2f);

    }

    }

其它的类都由jar包给实现类的。

猜你喜欢

转载自www.cnblogs.com/qingruihappy/p/9693367.html