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观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaweb项目如何实现手机短信登录

    javaweb项目如何实现手机短信登录

    这篇文章主要介绍了javaweb项目如何实现手机短信登录,手机号登录在现在的项目中用的场景非常多,实现起来也不难,今天我们就一起来通过演示实现登录过程,需要的朋友可以参考下
    2019-07-07
  • IDEA插件之Mybatis Log plugin 破解及安装方法

    IDEA插件之Mybatis Log plugin 破解及安装方法

    这篇文章主要介绍了IDEA插件之Mybatis Log plugin 破解方法及安装方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring为什么不推荐使用@Autowired注解详析

    Spring为什么不推荐使用@Autowired注解详析

    @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java导出网页表格Excel过程详解

    Java导出网页表格Excel过程详解

    这篇文章主要介绍了Java导出网页表格Excel过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java.lang.Long.parseLong()方法详解及示例

    Java.lang.Long.parseLong()方法详解及示例

    这个java.lang.Long.parseLong(String s) 方法解析字符串参数s作为有符号十进制长,下面这篇文章主要给大家介绍了关于Java.lang.Long.parseLong()方法详解及示例的相关资料,需要的朋友可以参考下
    2023-01-01
  • Java中操作Redis的详细方法

    Java中操作Redis的详细方法

    基于Jedis实现对redis中字符串的操作,文中通过实例代码给大家介绍的非常详细,包括连接池JedisPool应用的实例代码,对Java操作Redis的相关知识感兴趣的朋友一起看看吧
    2021-11-11
  • 详细分析java 动态代理

    详细分析java 动态代理

    这篇文章主要介绍了java 动态代理的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 总结Java常用排序算法

    总结Java常用排序算法

    在本文里我们给大家整理了关于Java常用排序算法以及实例代码分析,需要的朋友们跟着学习下。
    2019-03-03
  • 利用solr实现商品的搜索功能(实例讲解)

    利用solr实现商品的搜索功能(实例讲解)

    下面小编就为大家分享一篇利用solr实现商品的搜索功能,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Java 8新时间日期库java.time的使用示例

    Java 8新时间日期库java.time的使用示例

    这篇文章主要给你大家介绍了关于Java 8新时间日期库java.time的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07

最新评论