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);
    }
}
相关推荐
笨鸟飞不快10 分钟前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码16 分钟前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking20 分钟前
Java微服务练习方式
java·后端·微服务
朦胧之11 小时前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅15 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪16 小时前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly17 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨17 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜17 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端
SimonKing1 天前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员