设计模式之观察者

简介: 设计模式之观察者

观察者模式介绍



观察者又名事件订阅者、监听者。



观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察者”该对象的其他对象。


通知


目标:拥有一些值得关注的状态的对象。


发布者:它要自身的状态改变通知其他对象。


订阅者:希望关注发布者状态变化的其他对象。


观察者模式的发布者类添加订阅机制,每个对象都能订阅或取消订阅发布者事件流。


  • 一个用于存储订阅者对象引用的列表成员变量。


  • 几个用于添加或删除该列表中订阅者的共有方法。


  • 所有订阅者都必须实现同样的接口,发布者仅通过该接口与订阅者交互。(接口中必须声明通知方法及其参数)。


观察者模式结构


  • 1、发布者


会向其他对象发送值得关注的事件。事件会在发布者自身状态改变或执行特定行为后发生。发布者中包含一个允许新订阅者加入或退出的机制。


当新事件发生时,发送者会遍历订阅列表并调用订阅者对象的通知方法。


  • 2、订阅者接口


声明了通知接口,该接口包含一个update(更新)方法。通过该方法来传递事件的详细信息,方法中可拥有多个参数。


  • 3、具体订阅者


声明了订阅者接口,可以执行一些操作来回应发布者的通知。(所有具体订阅者都实现了同样的接口,发布者不需要与具体类相耦合)



有时还需要一些上下文信息来处理更新信息。这块可通过参数来传递上下文。



  • 4、客户端


分别创建发布者和订阅者,然后为订阅者注册发布者更新。


应用场景


1、 当一个对象状态的改变需要通知或改变其他对象,或一些被动消息接收时,可使用观察者模式。


2、 当应用中的某些对象必须观察其他对象时。


实现方式


  • 1、对业务进行拆分,一个为独立于其他代码的核心功能作为发布类;一个则为必须受到通知的订阅类


  • 2、声明订阅者和发布者接口,并在接口中定义一些必要的方法。


  • 3、确定存放实际订阅列表的位置并实现订阅方法。


  • 4、创建具体发布者类;在具体订阅者类中实现通知更新的方法。


  • 5、客户端必须生产所需的全部订阅者,并在相应的发布者处完成注册工作。


满足开闭原则;可以在运行时建立对象之间的联系。


Demo


观察者模式提供一种作用于任何实现了订阅者接口的对象的机制,可对其事件进行订阅和取消订阅。



阳光报社是一家在当地经营好多年的报社,以前都是报社将印刷好的报纸投放到各个报亭,供想买报纸的人进行挑选阅读,或者买报人可以直接去报社进行购买。随着科技的发展,电子邮箱越来越普及。人们可以按照自己的要求订阅和取消订阅,来查看各个报社的报纸新闻。


这个模式正好可以用我们学习的观察者模式来实现。那么接下来就让我们看看到底如何实现报社发报,订阅的人们可以收到报纸。


订阅者接口和实现



发布者接口和实现


客户端测试



输出结果



当发布者中的随机数为2时,A和B订阅者都收到了消息,当随机数为4时,且B取消了订阅,A和B都不满足条件,都没有收到消息。


学习了解下来,其实观察者模式理解起来不难,很容易就可以熟悉。后面就需要大家在业务逻辑中,当遇到满足可以使用观察者模式的业务时,可以采用此模式。


其实我感觉,这个模式叫做观察者模式不是很清晰,不能很好的表达其含义,应该叫订阅者模式。这样才能让人第一眼知道它是干什么的。



目录
相关文章
|
6月前
|
设计模式 算法 调度
行为型设计模式:模板设计模式/观察者设计模式/策略设计模式/责任链设计模式
行为型设计模式:模板设计模式/观察者设计模式/策略设计模式/责任链设计模式
55 0
|
6月前
|
设计模式
设计模式-观察者(发布订阅)模式
设计模式-观察者(发布订阅)模式
|
设计模式 存储 大数据
大数据开发基础的设计模式的观察者
观察者模式是大数据开发基础的设计模式之一。它是一种行为型模式,用于定义对象之间的一对多依赖关系,当一个对象状态发生改变时,其所有依赖者都会收到通知并自动更新。
83 0
|
设计模式 前端开发
前端通用编程基础的设计模式之观察者
观察者模式是前端开发中非常常见且实用的一种设计模式。该模式可以帮助我们更好地设计和实现一些复杂的应用程序,例如事件处理、数据绑定以及状态管理等。
116 0
|
设计模式 Java Spring
观察者设计模式
观察者设计模式 特点: 被观察者持有监听的观察者的引用 被观察者支持增加和删除观察者 被观察者主题状态改变,通知观察者 下面开始模拟观察者设计模式 版本1: 版本2: 版本3: 为什么呢?因为监听器这
102 0
|
设计模式 uml
Rxjava源码解析笔记 | Rxjava概述 & 传统观察者设计模式源码解析
Rxjava源码解析笔记 | Rxjava概述 & 传统观察者设计模式源码解析
|
设计模式 Java 测试技术
浅析Java设计模式【3.3】——观察者
Java常用设计模式,观察者模式
92 0
浅析Java设计模式【3.3】——观察者
|
设计模式
观察者设计模式
观察者设计模式
|
设计模式 前端开发 Java
探究netty的观察者设计模式
探究netty的观察者设计模式
144 0
|
设计模式 Java uml
CRUD很无聊?一起学设计模式吧!— 观察者模
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
89 0
CRUD很无聊?一起学设计模式吧!— 观察者模

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78