当前位置: 首页 > news >正文

设计模式:观察者模式示例

让我们通过一个天气监测应用的例子来展示观察者模式。在这个应用中,WeatherStation 作为可观察的主题,它会跟踪天气数据的变化。Display 作为观察者,当天气数据更新时会显示最新的信息。

示例代码:

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

// 观察者接口
interface Observer {
    void update(float temperature, float humidity, float pressure);
}

// 可观察对象接口
interface Observable {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

// 具体可观察对象:WeatherStation
class WeatherStation implements Observable {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

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

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }

    public void measurementsChanged() {
        notifyObservers();
    }

    @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);
        }
    }
}

// 具体观察者:Display
class Display implements Observer {
    private Observable weatherStation;

    public Display(Observable weatherStation) {
        this.weatherStation = weatherStation;
        weatherStation.registerObserver(this);
    }

    @Override
    public void update(float temperature, float humidity, float pressure) {
        System.out.println("Current conditions: " + temperature + "C degrees and " + humidity + "% humidity");
    }

    public void unsubscribe() {
        weatherStation.removeObserver(this);
    }
}

// 客户端代码
public class ObserverPatternExample {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();
        Display currentDisplay = new Display(weatherStation);

        // 模拟新的天气测量数据
        weatherStation.setMeasurements(28.2f, 65f, 1013.1f);
        weatherStation.setMeasurements(22.1f, 70f, 1012.5f);

        // 当不再需要显示当前天气情况时,取消订阅
        currentDisplay.unsubscribe();

        // 即使更新了天气数据,Display 也不会收到通知
        weatherStation.setMeasurements(25.5f, 60f, 1014.9f);
    }
}

在这个例子中,WeatherStation 类实现了 Observable 接口,负责管理观察者并在数据更新时通知它们。Display 类实现了 Observer 接口,并在接收到更新通知时显示当前的天气条件。客户端代码创建了一个天气站对象和一个显示器对象,并模拟了天气数据的变化。

这个例子展示了观察者模式的核心概念:对象可以订阅和取消订阅事件,而主题对象在状态变化时会通知所有的订阅者。

总结

这个天气监测应用的例子展示了观察者模式在实际应用中的使用。该模式允许对象在无需知道其他对象具体实现的情况下相互通信,从而实现了主题和观察者之间的解耦。通过使用观察者模式,我们可以轻松地添加新的观察者,或者在不影响其他观察者的情况下更改主题的状态更新逻辑。

http://www.dtcms.com/a/9956.html

相关文章:

  • Linux------一篇博客了解Linux最常用的指令
  • Doris实践——信贷系统日志分析场景的实践应用
  • C++ //练习 11.18 写出第382页循环中map_it的类型,不要使用auto或decltype。
  • V3+TS(基础知识详解)
  • Golang学习系列1-pprof性能调优
  • TypeScript基础知识
  • dm8 备份与恢复
  • 世优科技上榜2024年度《中国虚拟数字人影响力指数报告》
  • 如何从vue项目界面上看出来node.js版本
  • 练习 16 Web [极客大挑战 2019]LoveSQL
  • SpringBoot3整合RabbitMQ之一_消息生产者与消息消费者服务搭建
  • Vue之列表渲染
  • 【虚拟机】Vmware虚拟机桥接 Destination Host Unreachable 问题解决
  • 前端三剑客 —— CSS (第六节)
  • 浅谈HTTP
  • 用html写一个爱心
  • Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介
  • Linux第4课 Linux的基本操作
  • windows渗透信息收集
  • 【精品教程】护网HVV实战教程资料合集(持续更新,共20节)
  • Go语言时间编程
  • Android Studio 通过 WIFI 调试手机 app
  • CAD Plant3D 2024 下载地址及安装教程
  • 设计模式之建造者模式:灵活可扩展的对象创建过程
  • 华为审核被拒提示: 您的应用存在(最近任务列表隐藏风险活动)的行为,不符合华为应用市场审核标准
  • kvm、zstack导出qcow2文件
  • python项目练习——14.学生管理系统
  • 在.Net6中用gdal实现第一个功能
  • 4月04日,每日信息差
  • 利用Idea实现Ajax登录(maven工程)