观察者模式,回调函数,事件调度

news/2024/9/19 15:30:35/ 标签: 观察者模式

观察者模式

定义

是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖于它的对象都会收到通知并自动更新。

  • 主题(Subject):也称为被观察者,维护一个观察者列表,提供了添加、删除和通知观察者的方法。
  • 观察者(Observer):当收到主题的通知时,就会得到通知并执行相应的处理。
优点:

解耦,可扩展,灵活性

应用

发布-订阅的模式:事件处理系统(因而当一个事件发生,相关的部分都会响应),消息传递系统,事件监听器

回调函数

定义

回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。

应用

事件驱动程序,异步编程

实现方式

可调用对象:普通函数,bind,重载了 operator() 的类,lambda 表达式,函数指针等

事件调度者

也可以叫做事件分发器,作为观察者模式的主题,当事件发生时,事件调度者负责将该事件分发给所有相关的监听器,执行相应的事件

设计模式分类

创建型模式:关注于对象的创建方式,使得在创建对象时能够提供更好的灵活性和控制。

  1. 单例模式:确保一个类只有一个实例,并提供全局访问点。
  2. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
  3. 建造者模式:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  4. 工厂方法模式:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
  5. 原型模式:通过复制现有的实例来创建新的对象,而不是通过实例化类。

结构型模式:关注于如何将对象组合成更大的结构,以提供更高效、更灵活的设计。

  1. 适配器模式:将一个类的接口转换成客户端所期待的另一种接口形式,使原本由于接口不兼容而不能一起工作的类可以一起工作。
  2. 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  3. 装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
  4. 组合模式:将对象组合成树形结构以表示“整体-部分”的关系,使用户对单个对象和组合对象的使用具有一致性。
  5. 外观模式:提供了一个统一的接口,用来访问子系统中的一群接口,以简化其使用。
  6. 享元模式:运用共享技术有效地支持大量细粒度的对象。
  7. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。

行为型模式:关注于对象之间的交互和通信,以及对象职责的分配。

  1. 模板方法模式:定义一个算法的骨架,将一些步骤延迟到子类中实现,使得算法的结构保持不变,但允许不同的子类提供具体实现。
  2. 命令模式:将请求封装成一个对象,从而使得请求的发送者和接收者解耦。
  3. 迭代器模式:提供一种方法来访问聚合对象中的各个元素,而不需要暴露其内部表示。
  4. 观察者模式:定义一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
  5. 中介者模式:定义一个中介对象来封装一组对象之间的交互,以减少对象之间的直接耦合。
  6. 备忘录模式:允许在不破坏封装的前提下捕获一个对象的内部状态,并在需要时将其恢复。
  7. 解释器模式:定义一种语言的文法规则,并为该语言创建一个解释器,以解释处理用户的输入。
  8. 状态模式:允许对象在其内部状态发生改变时改变其行为,使对象看起来好像修改了其类。
  9. 策略模式:定义一系列算法,将它们封装成独立的策略类,使得它们可以互相替换而不影响客户端。
  10. 职责链模式:将请求的发送者和接收者解耦,从而允许多个对象处理请求。请求在对象链中沿着链传递,直到有一个对象处理它。
  11. 访问者模式:定义一种将操作从对象结构中分离出来的方式,使得可以在不改变对象的类的前提下,在不同的对象上执行不同的操作。


http://www.ppmy.cn/news/1526793.html

相关文章

ASP.NET Core 入门教学二十八 linux打包部署

在Linux上打包和部署ASP.NET Core应用程序涉及几个步骤。以下是一个详细的指南,帮助你在Linux系统上完成这一过程。 1. 准备工作 确保你的Linux系统已经安装了以下软件: .NET SDK(用于构建应用程序).NET Runtime(用…

华为地图服务 - 如何开启和展示“我的位置”? -- HarmonyOS自学10

一. 场景介绍 本章节将向您介绍如何开启和展示“我的位置”功能,“我的位置”指的是进入地图后点击“我的位置”显示当前位置点的功能。效果如下: 二. 接口说明 “我的位置”功能主要由MapComponentController的方法实现,更多接口及使用方法…

MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码

安装xcode, cmake, ninja brew install node mac下安装OpenGL库并使之对各项目可见 在macOS上安装OpenGL通常涉及到安装一些依赖库,如MGL、GLUT或者是GLEW等,同时确保LLVM的OpenGL框架和相关工具链的兼容性。以下是一个基本的安装…

深入理解Go语言中的接口定义与使用

在Go语言的编程实践中,接口(Interface) 是一个强大而灵活的特性,它允许我们定义一组方法,而不需要指定这些方法的具体实现。通过接口,我们可以将不同类型的值组合在一起,只要它们实现了接口中定…

Docker | 轻松管理容器:Portainer安装与使用指南

引言 在Docker的世界中,管理容器、镜像、网络和卷可能会变得复杂,特别是当项目规模扩大时。幸运的是,Portainer提供了一个简单而强大的可视化界面来管理Docker环境。本文将带你了解如何安装和使用Portainer,让你的容器管理变得更…

策略路由与路由策略的区别

🐣个人主页 可惜已不在 🐤这篇在这个专栏 华为_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 一、主体不同 二、方式不同 三、规则不同 四、定义和基本概念 一、主体不同 1、路由策略:是为了改…

[图解]强化自测题解析-总纲(一)02 抵制建模的心态

1 00:00:00,530 --> 00:00:02,270 今天我们来看 2 00:00:02,590 --> 00:00:06,270 强化自测题,总纲一的第二道题 3 00:00:07,260 --> 00:00:09,260 抵制建模的心态的题目 4 00:00:11,250 --> 00:00:11,860 单选题 5 00:00:13,430 --> 00:00:14,9…

【排序算法】之基数排序

一、算法介绍 基数排序是一种非比较型整数排序算法,其原理是将整数按低位到高位或者高位到低位的顺序,依次根据每一位的数值进行排序。通常情况下,基数排序会使用桶排序来处理每一位上的数值。 实现方法主要有如下: 最高位优先(…

基于鸿蒙API10的RTSP播放器(九:进度总结)

一、前言 基于鸿蒙API10和三方库ijkpalyer2.0.4,实现RTSP流的流畅播放,支持H.264和H.265硬编码,既可以在基于X86的模拟机上运行,也可以在基于armabi-v7a的真机上运行。 二、已实现功能 视频画面尺寸调整(2:1比例&am…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

redis基本数据结构-set

文章目录 1. set的基本介绍1.1. set底层结构之hash表的简单介绍1.2. 常用命令 2. 常见的业务场景2.1. 标签系统2.2. 社交网络好友关系 1. set的基本介绍 参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A redis 的 set 数据结构是一个无序的集合&#…

CSS 图片廊:打造精美视觉体验

CSS 图片廊:打造精美视觉体验 随着互联网技术的发展,网页设计越来越注重用户体验和视觉效果的呈现。CSS(层叠样式表)作为网页设计的重要工具,能够帮助开发者创建出既美观又实用的图片展示效果。本文将详细介绍如何使用…

html+css+js网页设计 旅游 龙门石窟4个页面

htmlcssjs网页设计 旅游 龙门石窟4个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#…

学习笔记(一)

前言 一、对象 1、由类建模而成,是消息、数据和行为的组合 2、可以接收和发送消息,并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化:把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

关于HarmonyOS的学习

day33 一、模块化 1.node模块化 let listMode require(./modules/list)let {index, tab} require(./modules/tab) ​// console.log(listMode)// console.log(tabMode) ​// console.log(listMode.index)// console.log(tabMode.index) ​// listMode.list() ​// console.…

istio中如何使用serviceentry引入外部服务

假设需要引入一个外部服务,外部服务ip为10.10.102.90,端口为32033. 引入到istio中后,我想通过域名gindemo.test.ch:9090来访问这个服务。 serviceentry yaml内容如下: apiVersion: networking.istio.io/v1beta1 kind: ServiceEn…

面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶,接下来我们将进行模版的进阶学习,介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即:出现在模板参数列表中,跟在class或…

ubuntu服务器版NVIDIA驱动失效解决方案

ubuntu服务器版NVIDIA驱动失效解决方案 1. 问题描述2. 解决方法--卸载并重新安装最新版显卡驱动cudacudnn2.1 卸载显卡驱动2.2 重新安装最新版显卡驱动cudacudnn2.2.1 显卡驱动2.2.2 cuda2.2.3 cuda安装cudnn 1. 问题描述 在终端输入nvidia-smi,输出如下&#xff1…

Leetcode 每日一题:Evaluate Division

写在前面 今天依旧是一道来自图论的题目,而今天这道题目的难度也是相对于前面分享过的题目中难度最大的一种。题主在第一次做这道题的时候根本没有反应过来这道题目可以转化为 图 来解决。而这道题目将一个 二维数组的乘除 运算转化为 图论 的过程需要一定的数学思…

企业组织韧性 Organizational Resilience(1990-2022年)

企业组织韧性(Organizational Resilience)是指企业在面对市场危机、经营挫折或环境变化时,能够迅速调整策略、适应变化,并从中恢复和成长的能力。 在VUCA(波动性、不确定性、复杂性、模糊性)情境下&#x…