Java设计模式之观察者模式observer pattern详解

 更新时间:2023年12月04日 10:16:45   作者:制造bug的键盘钢琴师  
这篇文章主要介绍了Java设计模式之观察者模式observer pattern详解,当一个对象发生数据变化时,通知其他相关的一系列对象,接受到通知的对象根据该对象的变化进行相应处理以响应变化的过程,需要的朋友可以参考下

观察者模式

简介:

当一个对象发生数据变化时,通知其他相关的一系列对象,接受到通知的对象根据该对象的变化进行相应处理以响应变化的过程。

概念解析:

其实与ActiveMQ、RabbitMQ等中间件的基本运行模式相类似,观察者模式的基础构建方式非常相近,其分为观察者与被观察者两个部分。

(一)观察者:从字面上看也就是指进行观察的对象,对应来说也就是消息订阅者;

(二)被观察者:当然被观察者也就是指被观察的对象,相应的角色也就是消息发布者。

运行方式:

推:消息以类似广播的形式通知观察者,观察者只能被动、无条件接受;

拉:接收到被观察者的通知,可以自主决定获取消息。

观察者模式的实现

两种方式实现观察者设计模式的实现,具体如下:

【1】手写观察者设计模式

【2】Java API 提供的观察者设计模式 使用 Java API 提供的 Observer 和 Observeable 实现观察者模式

手写观察者设计模式

编写被观察对象:subject.java

在这里插入图片描述

编写观察者接口,起到统一规范作用.

在这里插入图片描述

实现Observer接口,我们可以有一个或多个观察者对一个subject进行观察

在这里插入图片描述

编写主类,进行运行展示

在这里插入图片描述

运行接口展示:

在这里插入图片描述

通过API实现观察者模式

通过继承Observable父类,构建一个被观察者

在这里插入图片描述

实现Observer创建一个观察者类

在这里插入图片描述

通过编写主类测试类观察结果:

在这里插入图片描述

观察者模式的优缺点

优点:观察者与被观察者抽象耦合,可定义一种稳定的消息触发机制。 缺点:如果被观察者有多个间接的观察者,消息的传递将消耗更多时间,如果观察者与被观察者之间循环依赖,最终会导致系统崩溃。也正因如此与队列消息相类似,我们一般会单独开一个线程让其进行运行,以避免程序堵塞,不能运行的尴尬。

使用场景:

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 一个对象必须通知其他对象,而并不知道这些对象是谁。 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

注意事项:

1、JAVA 中已经有了对观察者模式的支持类。

2、避免循环引用。

3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

到此这篇关于Java设计模式之观察者模式observer pattern详解的文章就介绍到这了,更多相关Java观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Spring框架中异常处理情况浅析

    关于Spring框架中异常处理情况浅析

    最近学习Spring时,认识到Spring异常处理的强大,这篇文章主要给大家介绍了关于Spring框架中异常处理情况的相关资料,通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Java annotation元注解原理实例解析

    Java annotation元注解原理实例解析

    这篇文章主要介绍了Java annotation元注解原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 浅谈springboot自动装配原理

    浅谈springboot自动装配原理

    作为Spring Boot的精髓,自动配置原理首当其冲.今天就带大家了解一下springboot自动装配的原理,文中有非常详细的代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Maven导入依赖时报错如何解决

    Maven导入依赖时报错如何解决

    这篇文章主要介绍了Maven导入依赖时报错如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 解决J2EE-session在浏览器关闭后失效问题

    解决J2EE-session在浏览器关闭后失效问题

    最近做项目使用的是Spring+SpringMVC+Mybatis框架,maven管理目录的javaweb端系统,对于session的一些问题,在此小编给大家分享到脚本之家平台,需要的朋友参考下吧
    2018-01-01
  • spring配置文件中util:properties和context:property-placeholder用法

    spring配置文件中util:properties和context:property-placeholder用法

    这篇文章主要介绍了spring配置文件中util:properties和context:property-placeholder用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot MP简单的分页查询测试实现步骤分解

    SpringBoot MP简单的分页查询测试实现步骤分解

    好久没水后端的东西了,最近在做vue项目写前端的代码,所以cloud也停进度了,吃完饭突然记得我没有在博客里写分页的东西,虽然项目中用到了,但是没有拎出来,这里就拎出来看看
    2023-04-04
  • Java和C语言分别实现水仙花数及拓展代码

    Java和C语言分别实现水仙花数及拓展代码

    这篇文章主要介绍了分别用Java和C语言实现水仙花数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • java获取当前日期使用实例

    java获取当前日期使用实例

    本文为大家介绍java日期的使用实例,日期输出格式为date:2013-12-17,大家参考使用吧
    2014-01-01
  • Log4j日志分类和过滤敏感字段的实例

    Log4j日志分类和过滤敏感字段的实例

    这篇文章主要介绍了Log4j日志分类和过滤敏感字段的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论