C#基础16:事件与观察者模式
前文:https://blog.csdn.net/Jaihk662/article/details/96895681(委托)
一、事件与委托
其实事件就是委托的一种升级版,和委托的不同如下:
- 在原有的委托变量的基础上多一个 event 关键字,这个委托变量就称为事件;
- 在其它类中,事件只能使用 +=、-= 来注册方法,而不能使用 = 为事件关联方法,相对于委托更加安全
一个例子如下(你也可以把它当成委托的一个应用场景):
功能:当你按下键盘K后,可以模拟每月的自动续费功能,返回一个消费账单
当你按下Z键后,可以清除当前所有的自动续费
PlayerCtro.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public delegate void Func(); //声明一个委托
public class PlayerCtro : MonoBehaviour
{public Func func; //定义一个事件public static PlayerCtro instance;private void Awake(){instance = this; //继承于Mono的脚本单例写法,如果不是U3D环境,可以自己写个单例}private void Update(){if (Input.GetKeyDown(KeyCode.K)) //当按下"K"键后{Debug.Log("你本月的消费账单如下:");func();}if (Input.GetKeyDown(KeyCode.Z)){DelFunc();if(func == null) //如果委托没有绑定任何方法Debug.Log("你已成功取消所有的自动续费功能");}}public void DelFunc() //清空委托绑定的所有的方法,需要 using System;{Delegate[] delFunc = func.GetInvocationList();for (int i = 0; i < delFunc.Length; i++)func -= delFunc[i] as Func;}
}
Month.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Month : MonoBehaviour
{private void Start(){PlayerCtro.instance.func += Yueka; //玩家开启月卡自动续费...//PlayerCtro.instance.func = Yueka; 非法,事件只能在声明的类中使用"="号}public void Yueka(){Debug.Log("月卡:¥30");}
}
二、观察者模式
设计模式:为了解决一些固定问题的代码套路
观察者设计模式(Observer):又称“发布-订阅模式”,是一种一对多的依赖关系,多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,通知所有观察者
其实上面事件的例子,也可以算作一个非常简单的观察者模式的例子,另一个例子如下:
Subject.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public delegate void Func(string hint); //声明一个委托
public class Subject : MonoBehaviour
{public Func func; //定义一个事件public int index;public static Subject instance;private void Awake(){instance = this; //继承于Mono的脚本单例写法,如果不是U3D环境,可以自己写个单例}private void Start(){index = 905;}private void Update(){if (Input.GetKeyDown(KeyCode.K)) //当按下"K"键后,模拟下一集更新{func(string.Format("名侦探柯南第 {0} 集已经更新", ++index));}}
}
Observer1.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Observer1 : MonoBehaviour
{private void Start(){Subject.instance.func += Show; //模拟订阅Debug.Log("你已经成功订阅视频:“名侦探柯南”");}public void Show(string hint){Debug.Log("收到新消息" + hint);}
}
运行结果:
C#基础16:事件与观察者模式相关推荐
- [.net 面向对象编程基础] (22) 事件
[.net 面向对象编程基础] (22) 事件 事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是. ...
- 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链)
你不走出舒适圈,又怎么知道自己多坚强?! 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链) 前端面试 - JS总结(2) - ES6 (let, 箭头函数, this) 前 ...
- java 绑定事件_Javascripts事件基础和事件绑定
javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为 2.事件源 引发事件的元素(发生在谁身上) 3.事件处理的程序 对事件处理的程 ...
- JAVA JFrame画图基础和事件监听
JFrame画图基础和事件监听 消息框 JOptionPane.showMessageDialog(mine.this, "删除不成功!"); 画图 class MyJPanel ...
- java事件编程_java基础 ---Swing事件编程
java基础 ---Swing事件编程 GUI的设计就剩个菜单组建,这个组件也是想当于容器套容器,在设计方面没有什么难度,主要是一些事件的响应.还有另一种事件的监听方式,也就是适配器监听方法. 1.菜 ...
- 什么叫做java程序中的继承_【Java】基础16:什么叫继承?
原标题:[Java]基础16:什么叫继承? 面向对象三大特性:封装,继承.多态. 继承用一句话总结就是:父亲可以有很多儿子,但儿子只能有一个亲爹. 继承描述的是事物之间的所属关系.看下图: 动物是一个 ...
- vue中 点击事件的写法_vue基础之事件v-onclick=函数用法示例
本文实例讲述了vue基础之事件v-οnclick=函数用法.分享给大家供大家参考,具体如下: v-on:click/mouseout/mouseover/dblclick/mousedown..... ...
- Autosar诊断基础—诊断事件管理(DEM)
Autosar诊断基础--诊断事件管理 1 诊断事件管理(DEM)概念 2 DEM模块及关联模块关系 3 DEM模块介绍 3.1 诊断故障码(DTC)概念及确定方式 3.2 诊断故障码(DTC)的掩码 ...
- Unity之C#——委托与事件,观察者模式,猫和老鼠事例
委托与事件,观察者模式,猫和老鼠事例 在Unity游戏开发中,我们经常需要在一个类中,调用另一个类中的方法,比如,当玩家进入到某个地方,敌人就开始攻击玩家.这时就需要利用委托与事件,设计观察者模式. ...
- 计算机基础16秋在线作业,答案计算机基础16秋在线作业四
答案计算机基础16秋在线作业四+ v7 F& F6 X" z$ K+ k3 l- W 一.单选题: * ^, J3 R- H% Q! K, ^1.与录音质量无关的参数是( ). ...
最新文章
- python入门基础代码图-python入门基础知识(代码)
- C++Primer 第一章 快速入门 学习
- sql server2005 出现一个或多个参数无效
- Codeforces 991E. Bus Number (DFS+排列组合)
- 微软发布Win 10 开始按钮真正回归明年底上市
- hdu 2048 神、上帝以及老天爷
- Markdown 复选框
- 【GNN】图神经网络综述
- Drool的global变量
- 计算机网络原理之运输层
- 【遥感微课堂】学习ENVI5.0
- (附源码)小程序 记账微信小程序 毕业设计 180815
- 【整理】1、C网和G网双模手机是否可同时支持C网和G网上网?2、上网的同时是否可以打电话?3、呼叫等待和呼叫保持的概念与“双通”手机
- 胡雪岩与王有龄交浅言深的那些事
- 导航上显示某个地点已关闭什么意思_想要玩好iPhone手机,6个关闭、4个开启,要牢记...
- m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
- 【排序】冒泡排序与快速排序(三个版本+非递归图示详解哦)
- ArcGIS Pro添加在线遥感底图
- 招商银行信用卡还款冲账顺序
- Android App通过蒲公英实现更新
热门文章
- python发音翻译-python实现在线翻译
- 学完python能做什么-学完Python开发可以从事哪些行业?
- 2018年python工作好找吗-2018年 Python面试必看的10个问题及答案
- 千行代码入门python-要学 Python 需要怎样的基础?
- 网卡重启影响nfs吗_nfs常见问题解决办法
- 【MYSQL快速入门】常用函数:文本函数
- FFMPEG源码分析:avformat_open_input()(媒体打开函数)
- HEVC码流简单分析
- matlab08a调节字体大小,MATLAB低通滤波器的设计代码
- java构造器构造方法_Java构造器(构造方法/constructor)