DP-观察者模式代码详解

观察者模式: 定义一系列对象之间的一对多关系;当一个对象改变状态,它的依赖都会被通知。 主要由主题(Subject)和观察者(Observer)组成。

代码实现

java 复制代码
package com.designpatterns.observer;

/**
 * 定义主题接口
 */
public interface Subject {
   void registerObserver(Observer o);
   void removeObserver(Observer o);
    void notifyObservers();
}
java 复制代码
/**
 * 定义观察者接口
 */
public interface Observer {
    public void update(float temp,float humidity,float pressure);//当主题状态变更时,被调用
}
java 复制代码
package com.designpatterns.observer;

/**
 * 定义天气情况显示的元素接口
 */
public interface DisplayElement {
    public void display();
}
java 复制代码
package com.designpatterns.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体主题的实现
 */
public class WeatherDataConcretSubject implements  Subject{

   private List<Observer> observers;

   private float temperature;

   private  float humidity;

   private float pressure;

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

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

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

    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature,humidity,pressure);  //观察者更新天气数据
        }
    }

    public void measurementsChanged(){
       notifyObservers();//当测量到新的天气数据,通知观察者
    }

    /**
     * 设置天气测试数据
     * @param temperature
     * @param humidity
     * @param pressure
     */
    public void setMeasurements(float temperature,float humidity,float pressure){
       this.temperature=temperature;
       this.humidity=humidity;
       this.pressure=pressure;
       measurementsChanged();
    }

}
java 复制代码
package com.designpatterns.observer;

/**
 *
 * 具体每个观察者实现。每个观察着注册具体主题以接口更新
 *
 *
 * 显示当前的天气情况
 *
 *
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement{

    private float temperature;
    private float humidity;
    private WeatherDataConcretSubject weatherDataConcretSubject;

    public CurrentConditionsDisplay(WeatherDataConcretSubject weatherDataConcretSubject){
        this.weatherDataConcretSubject=weatherDataConcretSubject;
        weatherDataConcretSubject.registerObserver(this);
    }



    @Override
    public void update(float temp, float humidity, float pressure) {

        this.temperature=temp;
        this.humidity=humidity;
        display();

    }

    @Override
    public void display() {
        System.out.println("Current conditions:"+temperature+"F degrees and "+ humidity+"% humidity ");
    }
}
java 复制代码
package com.designpatterns.observer;

public class ForecastDisplay implements  Observer,DisplayElement{
    private float temperature;
    private float humidity;

    private WeatherDataConcretSubject weatherDataConcretSubject;

    public ForecastDisplay(WeatherDataConcretSubject weatherDataConcretSubject){
        this.weatherDataConcretSubject=weatherDataConcretSubject;
        weatherDataConcretSubject.registerObserver(this);
    }


    @Override
    public void display() {
        //显示预报的天气
        System.out.println("ForecastDisplay:"+temperature+"F degrees and "+ humidity+"% humidity ");
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temperature=temp;
        this.humidity=humidity;
        display();
    }
}
java 复制代码
package com.designpatterns.observer;

public class StatisticsDisplay implements Observer,DisplayElement{
    private float temperature;
    private float humidity;

    private WeatherDataConcretSubject weatherDataConcretSubject;

    public StatisticsDisplay(WeatherDataConcretSubject weatherDataConcretSubject){
        this.weatherDataConcretSubject=weatherDataConcretSubject;
        weatherDataConcretSubject.registerObserver(this);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temperature=temp;
        this.humidity=humidity;
        display();
    }

    @Override
    public void display() {
        //显示测量的avg,min,max值
        System.out.println("StatisticsDisplay:"+temperature+"F degrees and "+ humidity+"% humidity ");
    }
}
java 复制代码
package com.designpatterns.observer;

/**
 * 观察者模式测试
 */
public class WeatherStationTest {
    public static void main(String[] args) {
        WeatherDataConcretSubject weatherDataConcretSubject=new WeatherDataConcretSubject();

        CurrentConditionsDisplay currentConditionsDisplay=new CurrentConditionsDisplay(weatherDataConcretSubject);

        StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherDataConcretSubject);
        ForecastDisplay forecastDisplay=new ForecastDisplay(weatherDataConcretSubject);

        //设置模拟的气象数据
        weatherDataConcretSubject.setMeasurements(80,65,30.4f);
        weatherDataConcretSubject.setMeasurements(82,70,29.2f);
        weatherDataConcretSubject.setMeasurements(78,90,29.2f);
    }
}
相关推荐
学编程就要猛8 分钟前
Spring AI Alibaba(上)
java·人工智能·spring·springaialibaba
imDwAaY21 分钟前
Spring Boot的核心配置文件一览及其加载顺序
java·spring boot·后端
zhangx1234_24 分钟前
javaEE 多线程1
java·linux·服务器
鬼手点金28 分钟前
opencode-crawl4ai使用建议
java·开发语言·人工智能·python·机器学习
专业程序开发源42 分钟前
springboot校园志愿者管理系统28562-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
thefool1122661 小时前
多线程 2
java
daidaidaiyu10 小时前
ThingsBoard 集群的核心逻辑源码分析
java
我可能是个假开发11 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong11 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
【JAVA】玩家12 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring