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);
    }
}
相关推荐
覆东流3 小时前
7.Java数组
java·开发语言·后端
m0_719084113 小时前
限流和获取请求ip的方法
java
lzhdim3 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
深漂的华哥4 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
落魄大学生之流水线上谋生计5 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
爱学习的小白柏6 小时前
【AI问数技术】多Agent协同架构:查询规划/SQL生成/洞察分析/报告生成
java·网络·人工智能·windows·sql·架构·llama
码匠许师傅6 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
Larcher7 小时前
SDD 项目开发步骤与提示词
人工智能·设计模式·架构
沙盘客7 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
CHANCE V7 小时前
集合排序和流排序
java