博客
关于我
观察者模式(Observer Pattern)
阅读量:502 次
发布时间:2019-03-07

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

观察者模式是一种行为型设计模式,用于定义对象间的一对多关系。当一个对象的状态发生改变时,所有依赖于它的对象都会自动得到通知并被更新。这一模式特别适用于需要广播通知的场景,能够降低耦合度并提高系统的灵活性。

主要作用

观察者模式的核心在于建立一个触发机制,确保当目标对象状态改变时,其所有观察者对象都能及时接收到通知。这种机制使得系统能够轻松地扩展和维护,减少了对象之间的直接耦合。

适用场景

  • 抽象模型的多个方面:当一个模型有多个方面(如视图、控制器等)时,每个方面都可能依赖另一个方面的状态。通过将这些方面封装为独立的对象,可以实现各自的独立性和复用性。

  • 状态改变的广播:当一个对象的状态改变时,可能需要通知多个其他对象,而不必明确列出这些对象。观察者模式通过动态注册和解注册观察者,实现了这一点。

  • 链式触发机制:需要创建一条触发链,例如A对象的行为影响B对象,B对象的行为又影响C对象。观察者模式可以通过简单的订阅/发布机制来实现这种链式反应。

  • 优缺点分析

    优点

    • 抽象耦合:观察者模式允许观察者与目标对象之间保持松散的耦合关系,只需通过抽象接口进行通信。
    • 可扩展性:当需要新增观察者时,只需实现相应的接口,无需修改目标对象的代码。

    缺点

    • 性能开销:在Java中,每次状态改变时,必须遍历所有观察者并调用其方法,这在观察者数量众多时可能带来性能瓶颈。
    • 循环依赖问题:如果观察者与目标对象之间存在循环依赖,可能导致系统进入循环调用状态,影响正常运行。
    • 信息不对称:观察者只能感知目标对象发生了变化,但无法直接知道变化的具体内容。

    实现步骤

    观察者模式通常涉及三个类:Subject(主体)、Observer(观察者)和Client(客户)。具体实现步骤如下:

  • 创建Subject类

    • Subject类维护一个观察者列表,用来存储所有注册的观察者。
    • 定义一个状态变量,并提供设置状态的方法。在状态改变时,自动通知所有观察者。
  • 创建Observer抽象类

    • Observer类定义一个抽象的Update方法,用于接收状态改变的通知。
  • 创建具体的观察者类

    • 每个观察者类继承自Observer类,并实现Update方法,根据具体需求执行相应的操作。
  • 使用Subject和观察者类

    • 在主类中创建Subject实例,并注册多个观察者。
    • 改变Subject的状态时,触发所有观察者的Update方法。
  • 实际应用示例

    在实际开发中,观察者模式可以用在以下场景:

    • UI状态更新:当一个组件的状态发生改变时,更新其关联的所有视图组件。
    • 数据变化通知:当数据源发生变化时,通知所有依赖该数据的组件进行刷新。
    • 事件监听机制:实现一个事件发布/订阅系统,允许不同组件间进行异步通信。

    注意事项

    • Java的工具支持:Java提供了Observer模式的实现,例如通过EventListener接口。
    • 避免循环引用:在注册和解注册观察者时,必须确保不会导致循环依赖,否则可能引发死锁或其他问题。
    • 异步处理:为了避免UI阻塞或性能问题,通常在主线程之外处理状态更新和通知。

    通过以上步骤和注意事项,可以有效地在实际项目中应用观察者模式,提升系统的可维护性和扩展性。

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

    你可能感兴趣的文章
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>