博客
关于我
设计模式之观察者模式
阅读量:716 次
发布时间:2019-03-21

本文共 1824 字,大约阅读时间需要 6 分钟。

观察者模式: 解析一个经典的设计模式

模式定义:

观察者模式定义了对象之间的一对多依赖关系。简单来说,一个主题对象的变化可以同时通知多个观察者对象,使得所有相关对象可以同步更新。这类似于订阅者模式,所有依赖该主题的对象都可以获得最新信息。

这种模式的核心在于保持系统的耦合度尽可能低。当主题对象发生变化时,其所有关注的观察者都会收到通知并进行相应处理。观察者可以注册、解注册,这使得业务逻辑可以在运行时动态地建立起对象间的关系。

应用场景:

当我们需要对一个对象的状态进行跟踪或修改,而修改可能会影响多个相关对象时,观察者模式是个理想的选择。特别是在以下场景下尤其有用:

  • 当一个对象的状态可能会触发其他对象的状态变化,而你并不确定哪些对象可能会受到影响时。

  • 当对象之间的关系是动态建立或更改的,比如基于事件驱动的架构,观察者可以灵活地被管理。

  • 优点:

  • 符合开闭原则:
  • 开闭原则允许系统在不修改现有类的前提下扩展其功能。这使得观察者模式非常适合当系统需要扩展功能时不需要修改核心系统类。在观察者模式中,观察者接口和抽象类只需实现相关的方法,就可以随意添加新的处理逻辑。

    1. 可以在运行时建立对象之间的关系:
    2. 与其他模式如策略模式不同,观察者模式允许对象之间的关系是在运行时创建的。通过调用 registerObserver() 方法,可以随时为主题对象增加新的观察者。这种灵活性使得系统可以轻松应对动态的问题和未知的需求。

      在 JDK 和 Spring 中的应用:

      JDK:

    3. java.util.Observable 类是 JDK 中最早实现的观察者模式,它通过一个依赖列表来管理观察者。用户可以通过 registerObserver() 和 removeObserver() 方法将观察者添加或移除到列表中,然后通过 notifyObservers() 方法通知所有观察者。

    4. java.util.Observer 接口定义了一个标准的观察者接口,所有实现这个接口的类都可以作为观察者。

    5. Spring:

    6. Spring Framework 提供了更简洁的应用场景。通过 org.springframework.context.ApplicationListener 接口,用户可以接听 ApplicationContext 发 MOSDom 事件。

    7. org.springframework.context.event.ApplicationEvent 是一个特殊的事件类型,它允许应用程序监听器(ApplicationListener)接收到上下文启动或刷新事件。

    8. 关键实现:

      一个基本的观察者模式结构大致如下:

      Subject 接口定义了 registerObserver(), removeObserver(), notifyObservers() 三个方法。类似的,具体的实现类可能会用 ArrayList 存储观察者对象,并通过从列表中遍历调用每个观察者的 update() 方法传递信息。

      优化后的示例代码省略具体实现细节,但总体结构遵循这样一个模式:

      public abstract class Subject {protected List

      observers;

      public abstract void registerObserver(Observer observer); public abstract void removeObserver(Observer observer); public abstract void notifyObservers();

      }

      public interface Observer {void update(Subject subject, Object data);}

      一个典型的 WeatherData 类实现观察者模式,可以在数据属性上进行状态改造,并触发 notifyObservers() 方法将任何修改内容推送给所有观察者。

      还有一个具体的观察者 BaiduSite 类。当收到数据更新通知时,它可以根据需要展示到网站。

      实际应用中,这种模式可以被框架如 Spring 显式使用,如通过 ApplicationListener 来监听事件。

      总体而言,观察者模式使得系统能够在动态变化的情况下,有效地管理对象之间的依赖关系。它通过解耦关注点,使得系统能够以更灵活的方式扩展和维护代码。

    转载地址:http://bwwrz.baihongyu.com/

    你可能感兴趣的文章
    Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
    查看>>
    Node-RED中建立TCP服务端和客户端
    查看>>
    Node-RED中建立Websocket客户端连接
    查看>>
    Node-RED中建立静态网页和动态网页内容
    查看>>
    Node-RED中解析高德地图天气api的json数据显示天气仪表盘
    查看>>
    Node-RED中连接Mysql数据库并实现增删改查的操作
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED订阅MQTT主题并调试数据
    查看>>
    Node-RED通过npm安装的方式对应卸载
    查看>>
    node-request模块
    查看>>
    node-static 任意文件读取漏洞复现(CVE-2023-26111)
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    node.js debug在webstrom工具
    查看>>
    Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
    查看>>
    Node.js RESTful API如何使用?
    查看>>
    node.js url模块
    查看>>
    Node.js Web 模块的各种用法和常见场景
    查看>>