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);
    }
}
相关推荐
SimonKing8 小时前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠1 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840821 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide1 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家1 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺1 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602731 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
桦说编程1 天前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
程序员清风1 天前
用了三年AI,我总结出高效使用AI的3个习惯!
java·后端·面试
beata1 天前
Java基础-13: Java反射机制详解:原理、使用与实战示例
java·后端