当前位置: 首页 > news >正文

行为型模式-观察者模式

1.观察者设计模式*

定义当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

使用场景:

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。

  • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

  • 一个对象必须通知其他对象,而并不知道这些对象是谁。

  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

UML 类图: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。

ObserverPatternDemo,我们的演示类使用 Subject 和实体类对象来演示观察者模式。

相关文章:

行为型模式-观察者模式

1.观察者设计模式* 定义:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 意图:定义对象间的…...

前端面试:【新技术与趋势】WebAssembly、Serverless、GraphQL

在不断演进的技术领域中,WebAssembly、Serverless和GraphQL都是备受关注的新技术和趋势。它们改变了软件开发、部署和数据传输的方式,为开发者提供了更多的选择和灵活性。 1. WebAssembly(Wasm): 简介: Web…...

【ubuntu】 20.04 网络连接器图标不显示、有线未托管、设置界面中没有“网络”选项等问题解决方案

问题 在工作中 Ubuntu 20.04 桌面版因挂机或不当操作,意外导致如下问题 1、 Ubuntu 网络连接图标消失 2、 有线未托管 上图中展示的是 有线 已连接 ,故障的显示 有限 未托管 或其他字符 3、 ”设置“ 中缺少”网络“选项 上图是设置界面&#xff0c…...

SpringCloud/SpringBoot多模块项目中配置公共AOP模块实现打印子模块Controller所有请求参数与日志

项目中遇到多个模块需要打印Controller请求日志,在每个模块里面加AOP并且配置单独的切面笔者认为代码冗余,于是乎就打算把AOP日志打印抽离成一个公共模块,谁想用就引入Maven坐标就行。 定义公共AOP模块 并编写AOP工具 AOP模块pom.xml如下 &…...

【GeoDa实用技巧100例】022:geoda生成空间权重矩阵(邻接矩阵、距离矩阵)

geoda生成空间权重矩阵(邻接矩阵、距离矩阵),车式矩阵、后式矩阵、K邻接矩阵。 文章目录 一、概述二、“车式”邻接的gal文档生成三、“后式”邻接gal文档生成四、k最近邻居gat文档生成五、查看gal和gat文档一、概述 空间权重矩阵(或相应的表格形式)一般需要用计算机软件生…...

基于web的鲜花商城系统java jsp网上购物超市mysql源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于web的鲜花商城系统 系统有2权限:前台…...

意外发现Cortex-M内核带的64bit时间戳,比32bit的DWT时钟周期计数器更方便,再也不用担心溢出问题了

视频: https://www.bilibili.com/video/BV1Bw411D7F5 意外发现Cortex-M内核带的64bit时间戳,比32bit的DWT时钟周期计数器更方便,再也不用担心溢出问题了 介绍: 看参数手册的Debug章节,System ROM Table里面带Timestam…...

数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

文章目录 前言一、单源最短路径1、单源最短路径问题2、Dijkstra 初始化a、参数b、初始化参数c、算法步骤 3、Dijkstra 算法详细步骤a、第一轮算法执行b、第二轮算法执行c、第三轮算法执行d、第四轮算法执行e、第五轮算法执行f、第六轮算法执行 4、java算法实现 二、多源最短路径…...

改进YOLO系列:6.添加ECA注意力机制

添加ECA注意力机制 1. ECA注意力机制论文2. ECA注意力机制原理3. ECA注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. ECA注意力机制论文 论文题目:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 论文链接:ECA-N…...

软件测试知识点总结(一)

文章目录 前言一. 什么是软件测试二. 软件测试和软件调试的区别三. 软件测试和研发的区别四. 优秀的测试人员所应该具备的素质总结 前言 在现实生活中的很多场景下,我们都会进行测试。 比如买件衣服,我们需要看衣服是不是穿着好看,衣服材质如…...

持续集成与持续交付:现代软件测试的变革之路

引言 在数字化时代,软件开发的速度和复杂性都在不断增加。为了满足市场的需求,企业需要更快、更高效地交付高质量的软件产品。在这样的背景下,持续集成与持续交付(CI/CD)成为了软件开发和测试的核心实践。 软件开发的…...

深度学习基本理论下篇:(梯度下降/卷积/池化/归一化/AlexNet/归一化/Dropout/卷积核)、深度学习面试

深度学习基本理论上篇:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播) 深度学习基本理论上篇:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播)、深度学习面试_会害羞的杨…...

[Ubuntu 20.04] 通过udev规则修改网卡名称(例如eth0)

在 Ubuntu 20.04 操作系统中,默认情况下,网卡接口名称采用了一种较为复杂的命名方式(如 enp0s3、eth0 等)。然而,有时候我们可能更希望使用更简洁和易于识别的名称来标识不同的网络接口。那么如何在 Ubuntu 20.04 中修改网卡接口的名称,以满足个性化需求。 步骤一:查看当…...

Java“牵手”根据关键词搜索(分类搜索)lazada商品列表页面数据获取方法,lazadaAPI实现批量商品数据抓取示例

lazada商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取lazada商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问lazada商城的网页来获取商品详情信息。以下是两种常用方法的介…...

Java—实现多线程程序 | 入门

目录 一、前言 二、基本概念 进程 线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级 设置优先级 一、前言 前期入门学习的代码中,全部都是单线的程序,也就是从头到尾…...

8.5 【C语言】指向函数的指针

8.5.1 什么是函数的指针 每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。 8.5.2 用函数指针变量调用函数 例8.22 用函数求整数a和b中的大者 解题思路:在主函数调用max函数,除了可以通过函数名调用外,还可…...

C++实现字符串的逆置

目录 C和C的区别 【1】C对C的扩充 【2】C对C的兼容 第一个C程序 【1】hello world 【2】cout标准输出流对象 i)介绍 ii)运算 iii)cout的使用 iv)使用cout指定格式的输出 练习:1、输出斐波那契的前10项。 【3】…...

论Spring或Spring Boot的花式扩展

文章目录 引言扩展点讲述花式扩展之自动配置类花式扩展之实现接口实现方式样例 花式扩展之自定义starterImport方式SpringFactories方式 总结鸣谢 引言 Spring Boot是一个高度可定制的框架,旨在帮助开发者快速创建、配置和管理他们的应用程序 扩展点讲述 Spring Bo…...

如何评估分类模型的好坏

如何评估分类模型的好坏 评估分类预测模型的质量,常用一个矩阵、三条曲线和六个指标。 一个矩阵:混淆矩阵;三条曲线:ROC曲线、PR曲线、KS曲线;六个指标:正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…...

● 84.柱状图中最大的矩形

84.柱状图中最大的矩形 class Solution { public:int largestRectangleArea(vector<int>& heights) {stack<int>st;heights.insert(heights.begin(),0);heights.push_back(0);st.push(0);int res0;for(int i1;i<heights.size();i){while(heights[i]<heig…...

Cursor Pro破解工具终极指南:5步实现永久免费使用的完整教程

Cursor Pro破解工具终极指南&#xff1a;5步实现永久免费使用的完整教程 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached yo…...

如何用OBS插件打造专业音乐直播?Tuna插件完整指南

如何用OBS插件打造专业音乐直播&#xff1f;Tuna插件完整指南 【免费下载链接】tuna Song information plugin for obs-studio 项目地址: https://gitcode.com/gh_mirrors/tuna1/tuna 想让你的OBS直播画面瞬间升级为专业音乐电台风格吗&#xff1f;Tuna插件正是你需要的…...

别再只会用点号了!Python里getattr()的5个实战骚操作,让你的代码更灵活

别再只会用点号了&#xff01;Python里getattr()的5个实战骚操作&#xff0c;让你的代码更灵活 在Python开发中&#xff0c;我们经常需要动态地访问对象的属性和方法。虽然直接使用点号(.)是最常见的做法&#xff0c;但在某些场景下&#xff0c;getattr()函数能带来更灵活、更优…...

ModuleNotFoundError: No module named ‘ui_form‘

问题描述&#xff1a;在QT CREATER创建一个新的python QT项目后&#xff0c;若无法直接编译而是报错如下&#xff1a;解决办法&#xff1a; 在该项目的目录下输入cmd&#xff0c;打开命令行窗口——然后输入pyside6-uic form.ui -o ui_form.py 运行即可正常编译 &#xff08;若…...

Swift原生大语言模型推理引擎llmfarm_core.swift集成与优化指南

1. 项目概述&#xff1a;一个为Swift生态打造的本地大语言模型推理引擎 最近在折腾一个iOS上的AI应用&#xff0c;想把一些轻量级的开源大语言模型&#xff08;LLM&#xff09;直接跑在手机端。大家都知道&#xff0c;现在主流的LLM推理框架&#xff0c;像llama.cpp、ollama&am…...

LeagueAkari游戏数据分析工具:从新手到高手的完整进阶攻略

LeagueAkari游戏数据分析工具&#xff1a;从新手到高手的完整进阶攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄联盟游戏…...

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂IP报文每个字段

用Wireshark解密IP协议&#xff1a;从抓包实战到网络诊断的完全指南 当你第一次打开网络教材看到IP报文那密密麻麻的字段时&#xff0c;是否感觉像在解读外星密码&#xff1f;传统的学习方法让我们死记硬背"版本号4位、首部长度4位、服务类型8位..."&#xff0c;但今…...

AI智能体安全防护:ClawGuard主动防御系统架构与实战部署

1. 项目概述&#xff1a;为AI智能体构建一道主动防御的“防火墙”在AI智能体&#xff08;AI Agent&#xff09;技术快速普及的今天&#xff0c;我们正面临一个全新的安全挑战。想象一下&#xff0c;你精心调教的AI助手&#xff0c;能够自主浏览网页、调用API、执行命令&#xf…...

机器人学习中的物理驱动数据生成框架解析

1. 物理驱动数据生成框架解析在机器人学习领域&#xff0c;接触丰富的操作任务&#xff08;如物体旋转、装配等&#xff09;对数据质量提出了极高要求。传统基于轨迹优化的方法虽然能通过物理仿真生成动态可行的运动轨迹&#xff0c;但存在全局探索不足的问题。我们提出的创新框…...

终极图形化方案:Applite如何让Mac软件管理变得简单快速

终极图形化方案&#xff1a;Applite如何让Mac软件管理变得简单快速 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为Mac上的软件安装、更新和卸载而烦恼吗&#xff1f;Ap…...