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

Posted qingruihappy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式------观察者设计模式(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包给实现类的。

 

以上是关于设计模式------观察者设计模式(jdk自带)的主要内容,如果未能解决你的问题,请参考以下文章

JDK自带的观察者模式源码分析以及和自定义实现的取舍

观察者模式学习--使用jdk的工具类简单实现

设计模式之观察者模式2

设计模式之观察者模式-以jdk实现为例

设计模式 - 观察者模式(JDK)

java自带的观察者模式