• 设计模式之观察者模式(十四)


    目录

    1. 背景

    1.1 天气预报项目

    2. 观察者模式

    2.1 观察者模式解决天气预报项目

    2.2 观察者模式在JDK中应用


    1. 背景

    1.1 天气预报项目

    天气预报项目需求 , 具体要求如下:
    • 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)
    • 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
    • 提供温度、气压和湿度的接口。
    • 测量数据更新时,要能实时的通知给第三方。

    正常实现就是在气象站中聚合第三方,当数据发生变化是调用第三方的方法实现数据更新。

    新增第三方时违反ocp原则, 不利于维护,也不能动态加入。

    2. 观察者模式

    2.1 观察者模式解决天气预报项目

    其实可以没有Subject接口,主要的类就是WeatherData,里面聚合一个Observe的List,实现观察者注册,删除,通知等功能。

    Observer:观察者接口。

    1. //观察者接口,有观察者来实现
    2. public interface Observer {
    3. public void update(float temperature, float pressure, float humidity);
    4. }
    5. public class CurrentConditions implements Observer {
    6. // 温度,气压,湿度
    7. private float temperature;
    8. private float pressure;
    9. private float humidity;
    10. // 更新 天气情况,是由 WeatherData 来调用,我使用推送模式
    11. public void update(float temperature, float pressure, float humidity) {
    12. this.temperature = temperature;
    13. this.pressure = pressure;
    14. this.humidity = humidity;
    15. display();
    16. }
    17. // 显示
    18. public void display() {
    19. System.out.println("***Today mTemperature: " + temperature + "***");
    20. System.out.println("***Today mPressure: " + pressure + "***");
    21. System.out.println("***Today mHumidity: " + humidity + "***");
    22. }
    23. }
    24. public class BaiDu implements Observer{
    25. // 温度,气压,湿度
    26. private float temperature;
    27. private float pressure;
    28. private float humidity;
    29. @Override
    30. public void update(float temperature, float pressure, float humidity) {
    31. this.temperature = temperature;
    32. this.pressure = pressure;
    33. this.humidity = humidity;
    34. display();
    35. }
    36. // 显示
    37. public void display() {
    38. System.out.println("===百度网站====");
    39. System.out.println("***百度网站 气温 : " + temperature + "***");
    40. System.out.println("***百度网站 气压: " + pressure + "***");
    41. System.out.println("***百度网站 湿度: " + humidity + "***");
    42. }
    43. }

    WeatherData

    1. public class WeatherData {
    2. // 温度,气压,湿度
    3. private float temperature;
    4. private float pressure;
    5. private float humidity;
    6. //第三方集合
    7. private List observers;
    8. public WeatherData() {
    9. this.observers = new ArrayList<>();
    10. }
    11. //当数据有更新时,就调用 setData
    12. public void setData(float temperature, float pressure, float humidity) {
    13. this.temperature = temperature;
    14. this.pressure = pressure;
    15. this.humidity = humidity;
    16. //调用dataChange, 将最新的信息 推送给 接入方 currentConditions
    17. notifyObservers();
    18. }
    19. //注册一个观察者
    20. public void registerObserve(Observer o) {
    21. observers.add(o);
    22. }
    23. //移除一个观察者
    24. public void removeObserve(Observer o) {
    25. observers.remove(o);
    26. }
    27. //遍历所有的观察者,并通知
    28. public void notifyObservers() {
    29. observers.forEach(a -> a.update(this.temperature, this.pressure, this.humidity));
    30. }
    31. public float getTemperature() {
    32. return temperature;
    33. }
    34. public void setTemperature(float temperature) {
    35. this.temperature = temperature;
    36. }
    37. public float getPressure() {
    38. return pressure;
    39. }
    40. public void setPressure(float pressure) {
    41. this.pressure = pressure;
    42. }
    43. public float getHumidity() {
    44. return humidity;
    45. }
    46. public void setHumidity(float humidity) {
    47. this.humidity = humidity;
    48. }
    49. public List getObservers() {
    50. return observers;
    51. }
    52. public void setObservers(List observers) {
    53. this.observers = observers;
    54. }
    55. }

    Client

    1. public class Client {
    2. public static void main(String[] args) {
    3. WeatherData weatherData = new WeatherData();
    4. Observer baiDu = new BaiDu();
    5. CurrentConditions currentConditions = new CurrentConditions();
    6. weatherData.registerObserve(baiDu);
    7. weatherData.registerObserve(currentConditions);
    8. weatherData.setData(10f,20f,30f);
    9. System.out.println("=======================");
    10. weatherData.removeObserve(baiDu);
    11. weatherData.setData(100f,200f,300f);
    12. }
    13. }

    2.2 观察者模式在JDK中应用

    JDK的 Observable类 就是JDK帮我们写好的一个观察者模式。

    Observable:相当于Weather,已经帮我们写好了管理Observer的方法。

    Observer:就是我们刚才写的接口。

  • 相关阅读:
    Redis系列——5种常见数据类型day1-3
    探花系统 Java笔试题
    你真的知道 NPM、Yarn 与 PNPM 这三个前端包管理器之间的区别吗?
    会议高清直播录播系统
    JavaScript 操作浏览器和HTML文档/JavaScript 操作对象
    Ryght 在 Hugging Face 专家助力下赋能医疗保健和生命科学之旅
    小米笔试真题一
    Appium的使用教程
    Flutter高仿微信-第48篇-群聊-图片
    IO 流(二)
  • 原文地址:https://blog.csdn.net/weixin_45734473/article/details/128147524