程序框架-事件中心模块-观察者模式
一、观察者模式
1.1 观察者模式定义
意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变是,所有依赖于它的对象都能得到通知并自动更新。
适用性:
- 当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时, 可使用观察者模式。
- 当应用中的一些对象对象观察其他对象时,可以使用此模式。订阅列表是动态的,因此订阅者可随时会加入或离开此列表。
1.2 观察者模式结构
-
发布者:会向其他对象发送值得关注的事件。 事件会在发布者自身状态改变或执行特定行为后发生。 发布者中包含一个允许新订阅者加入和当前订阅者离开列表的订阅构架。
当新事件发生时, 发送者会遍历订阅列表并调用每个订阅者对象的通知方法。 该方法是在订阅者接口中声明的。
-
订阅者: 接口声明了通知接口。 在绝大多数情况下, 该接口仅包含一个 update更新方法。 该方法可以拥有多个参数, 使发布者能在更新时传递事件的详细信息。
-
具体订阅者: 可以执行一些操作来回应发布者的通知。 所有具体订阅者类都实现了同样的接口, 因此发布者不需要与具体类相耦合。
订阅者通常需要一些上下文信息来正确地处理更新。 因此, 发布者通常会将一些上下文数据作为通知方法的参数进行传递。 发布者也可将自身作为参数进行传递, 使订阅者直接获取所需的数据。
-
客户端 :会分别创建发布者和订阅者对象, 然后为订阅者注册发布者更新。
二、实例
实现思路
- 声明订阅者接口。 该接口声明一个通知方法。
- 声明发布者接口并定义一些接口来在列表中添加和删除订阅对象。
- 创建具体发布者类。 每次发布者发生了重要事件时都必须通知所有的订阅者。
- 在具体订阅者类中实现通知更新的方法。


1.Monster
public class Monster : MonoBehaviour
{public string sname = "怪物x";// Start is called before the first frame updatevoid Start(){Invoke("Dead",1);}void Dead(){Debug.Log("怪物死亡!");//GameObject.Find("Player").GetComponent<Player>().MonsterDead(this);//GameObject.Find("Task").GetComponent<Task>().TaskmonsterDead(this);//GameObject.Find("Other").GetComponent<Other>().OthermonsterDead(this);EventCenter.GetInstance().EventTrigger("MonsterDead",this);}
}
2.Player
void Start()
{ EventCenter.GetInstance().AddEventListener("MonsterDead", MonsterDeadDo);
}public void MonsterDeadDo(object info)
{Debug.Log("玩家的奖励"+ (info as Monster).name);
}void OnDestory()
{EventCenter.GetInstance().RemoveEventListener("MonsterDead", MonsterDeadDo);
}
3.EventCenter
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;/// <summary>
/// 事件中心 单例模式对象
/// 1.dictionary
/// 2.委托
/// 3.观察者设计模式
/// </summary>
public class EventCenter : Singleton<EventCenter>
{//使用泛型委托传递怪物-蝙蝠等 具体敌人类型public Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>();/// <summary>/// 添加事件监听/// </summary>/// <param name="name">事件的名字</param>/// <param name="action">准备用来处理事件的 委托函数</param>public void AddEventListener(string name,UnityAction<object> action){//判断事件中心是否有此 函数if (eventDic.ContainsKey(name))eventDic[name] += action;//无elseeventDic.Add(name, action);}/// <summary>/// 执行函数/// </summary>/// <param name="name">事件名</param>/// <param name="info">传递参数 具体怪物类型</param>public void EventTrigger(string name,object info){//判断触发中心是否有此 函数if (eventDic.ContainsKey(name)){eventDic[name](info);}}/// <summary>/// 移除对应事件监听/// </summary>/// <param name="name">事件名</param>/// <param name="action">委托函数</param>public void RemoveEventListener(string name, UnityAction<object> action){//判断事件中心是否有此 函数if (eventDic.ContainsKey(name))eventDic[name] -= action;}/// <summary>/// 清空事件中心,主要用于场景切换/// </summary>public void Clear(){eventDic.Clear();}
}
相关文章:
程序框架-事件中心模块-观察者模式
一、观察者模式 1.1 观察者模式定义 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变是,所有依赖于它的对象都能得到通知并自动更新。 适用性: 当一个对象状态的改变需要改变其他对象, 或实际对…...
通过AOP的ProceedingJoinPoint获取方法信息
文章目录 ProceedingJoinPoint用法 ProceedingJoinPoint用法 获得切点对应的方法(Method) 本处Method指的是java.lang.reflect.Method 若切入点表达式是方法,则获得的是切入点方法的信息。若切入点表达式是注解,则获得的是使用了…...
【JavaSE】初步认识类和对象
【本节目标】 1. 掌握类的定义方式以及对象的实例化 2. 掌握类中的成员变量和成员方法的使用 3. 掌握对象的整个初始化过程 目录 1. 面向对象的初步认知 2. 类定义和使用 3. 类的实例化 4. this引用 1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语…...
python中的matplotlib画饼图(数据分析与可视化)
直接开始 1、先安装pandas和matplotlib pip install pandas pip install matplotlib2、然后在py文件中导入 import pandas as pd import matplotlib.pyplot as plt3、然后直接写代码 import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns&…...
用Rust实现23种设计模式之 职责链模式
关注我,学习Rust不迷路!! 优点 解耦:职责链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,而不是将请求的发送者和接收者紧密耦合在一起。灵活性:可以动态地改变或扩展处理请求…...
进销存管理中的技术创新和数字化转型
在进销存管理中,技术创新和数字化转型可以通过以下具体的应用案例来实现: 自动化仓储系统:利用自动化技术和机器人系统来管理仓库操作,包括货物的装卸、分拣和存储。这可以提高仓库的运作效率,减少人力成本࿰…...
与“云”共舞,联想凌拓的新科技与新突破
伴随着数字经济的高速发展,IT信息技术在数字中国建设中起到的驱动和支撑作用也愈发凸显。特别是2023年人工智能和ChatGPT在全球的持续火爆,更是为整个IT产业注入了澎湃动力。那么面对日新月异的IT信息技术,再结合疫情之后截然不同的经济环境和…...
【超细节】Vue3组件事件怎么声明,defineEmits与emit
目录 前言 一、基本语法 1. 子组件触发 2. 父组件监听 二、 事件参数 1. 传值 2. 接收值 三、 事件校验 四、注意事项 前言 组件事件是 Vue 组件之间进行通信的一种方式。它允许一个组件触发一个自定义事件,并且其他组件可以监听并响应这个事件。 一、基本…...
java Selenium 实现简单的网页操作
官方文档:入门指南 | Selenium Selenium是一个用于Web应用测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。 所以使用这个前端测试话工具,可以自动化做很多事情,比如自动化抓取网页内容,俗称网…...
(数据库系统概论|王珊)第一章绪论-第一节:数据库系统概论
目录 一:四大基本概念 (1)数据(Data) (2)数据库(DataBase,DB) (3)数据库管理系统(DataBase Management System,DBMS) (4)数据库系统(Database System,DBS…...
深入理解TCP三次握手:连接可靠性与安全风险
目录 导言TCP简介和工作原理的回顾TCP三次握手的目的和步骤TCP三次握手过程中可能出现的问题和安全风险为什么TCP三次握手是必要的?是否可以增加或减少三次握手的次数?TCP四次挥手与三次握手的异同点 导言 在网络通信中,TCP(Tra…...
基于人工智能的智能矿山解决方案
什么是智能矿山? 智能矿山是一种运用先进技术和智能化系统来管理和监控矿山运营的概念。它利用传感器、无线通信、数据分析和人工智能等技术,实现对矿山内部各个环节的实时监测、自动化控制和智能决策,从而提高矿山的效率、安全性和可持续性。…...
vue-cli3项目优化
首先添加两个量化的插件,方便对项目目前的情况进行分析: 1.添加speed-measure-webpack-plugin插件 —量化的指标可以看出前后对比 使用步骤: 安装speed-measure-webpack-plugin依赖 npm install speed-measure-webpack-plugin -D配置vue.c…...
Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting
安装PlatformIO插件成功,初始化失败 错误信息判断问题尝试访问https://pypi.tuna.tsinghua.edu.cn/simple/platformio/成功点击文件后报错如下: 解决问题- 换源 ( Windows下有两个地方需要更改)cmd命令行Pip文件 总结:…...
git bash 安装sdkadmin
1.下载相关安装包,复制到git 安装目录 D:\software\Git\mingw64\bin 2. 运行 curl -s "https://get.sdkman.io" | bash...
如何在IEEE论文中添加伪代码pseudocode
前言 记录写论文过程中需要重复用的一些小技巧: 一、如何在IEEE论文中添加伪代码pseudocode pseudocode是经常需要在论文中使用的流程图,掌握如何写伪代码图是必须得。 1.引入库 代码如下(示例): # 头部添加不可少的…...
【css】css隐藏元素
display:none:可以隐藏元素。该元素将被隐藏,并且页面将显示为好像该元素不在其中。visibility:hidden: 可以隐藏元素。但是,该元素仍将占用与之前相同的空间。元素将被隐藏,但仍会影响布局。 代码: <!…...
JUC并发编程(二)ForkJoinPool、Future、CompletableFuture、CAS
文章目录 ForkJoin分治工作窃取ForkJoinPool与ThreadPoolExecutor使用案例不带返回值的计算--RecursiveAction带返回值的计算--RecursiveTask Future 异步回调烧水案例join实现FutureTask实现 CompletableFuture为什么叫CompletableFuture?创建异步任务supplyAsyncrunAsync获取…...
大数据课程F2——HIve的安装操作
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解HIve的安装概念; ⚪ 掌握HIve安装步骤和Linux常用命令; ⚪ 掌握HIve安装的连接池jar包冲突和日志打印jar包冲突; ⚪ 掌握HIve安装的Hadoop安装配置; ⚪ 掌握HIve安装的JDK安装配…...
华为云hcip核心知识笔记(存储服务规划)
云上存储 : 云硬盘:基于分布式架构,可弹性扩展的虚拟块存储服务 注意事项 挂载云硬盘实例和云硬盘必须在同一区域,否则挂载失败文件存储服务:完全托管的共享文件存储 可以为多个实例实现共享访问,不同vpc中可以进行对…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
