博客
关于我
设计模式之观察者模式
阅读量: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/

    你可能感兴趣的文章
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>