前文: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:事件与观察者模式相关推荐

  1. [.net 面向对象编程基础] (22) 事件

    [.net 面向对象编程基础] (22)  事件 事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是. ...

  2. 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链)

    你不走出舒适圈,又怎么知道自己多坚强?! 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链) 前端面试 - JS总结(2) - ES6 (let, 箭头函数, this) 前 ...

  3. java 绑定事件_Javascripts事件基础和事件绑定

    javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为 2.事件源 引发事件的元素(发生在谁身上) 3.事件处理的程序 对事件处理的程 ...

  4. JAVA JFrame画图基础和事件监听

    JFrame画图基础和事件监听 消息框 JOptionPane.showMessageDialog(mine.this, "删除不成功!"); 画图 class MyJPanel ...

  5. java事件编程_java基础 ---Swing事件编程

    java基础 ---Swing事件编程 GUI的设计就剩个菜单组建,这个组件也是想当于容器套容器,在设计方面没有什么难度,主要是一些事件的响应.还有另一种事件的监听方式,也就是适配器监听方法. 1.菜 ...

  6. 什么叫做java程序中的继承_【Java】基础16:什么叫继承?

    原标题:[Java]基础16:什么叫继承? 面向对象三大特性:封装,继承.多态. 继承用一句话总结就是:父亲可以有很多儿子,但儿子只能有一个亲爹. 继承描述的是事物之间的所属关系.看下图: 动物是一个 ...

  7. vue中 点击事件的写法_vue基础之事件v-onclick=函数用法示例

    本文实例讲述了vue基础之事件v-οnclick=函数用法.分享给大家供大家参考,具体如下: v-on:click/mouseout/mouseover/dblclick/mousedown..... ...

  8. Autosar诊断基础—诊断事件管理(DEM)

    Autosar诊断基础--诊断事件管理 1 诊断事件管理(DEM)概念 2 DEM模块及关联模块关系 3 DEM模块介绍 3.1 诊断故障码(DTC)概念及确定方式 3.2 诊断故障码(DTC)的掩码 ...

  9. Unity之C#——委托与事件,观察者模式,猫和老鼠事例

    委托与事件,观察者模式,猫和老鼠事例 在Unity游戏开发中,我们经常需要在一个类中,调用另一个类中的方法,比如,当玩家进入到某个地方,敌人就开始攻击玩家.这时就需要利用委托与事件,设计观察者模式. ...

  10. 计算机基础16秋在线作业,答案计算机基础16秋在线作业四

    答案计算机基础16秋在线作业四+ v7 F& F6 X" z$ K+ k3 l- W 一.单选题: * ^, J3 R- H% Q! K, ^1.与录音质量无关的参数是(    ). ...

最新文章

  1. python入门基础代码图-python入门基础知识(代码)
  2. C++Primer 第一章 快速入门 学习
  3. sql server2005 出现一个或多个参数无效
  4. Codeforces 991E. Bus Number (DFS+排列组合)
  5. 微软发布Win 10 开始按钮真正回归明年底上市
  6. hdu 2048 神、上帝以及老天爷
  7. Markdown 复选框
  8. 【GNN】图神经网络综述
  9. Drool的global变量
  10. 计算机网络原理之运输层
  11. 【遥感微课堂】学习ENVI5.0
  12. (附源码)小程序 记账微信小程序 毕业设计 180815
  13. 【整理】1、C网和G网双模手机是否可同时支持C网和G网上网?2、上网的同时是否可以打电话?3、呼叫等待和呼叫保持的概念与“双通”手机
  14. 胡雪岩与王有龄交浅言深的那些事
  15. 导航上显示某个地点已关闭什么意思_想要玩好iPhone手机,6个关闭、4个开启,要牢记...
  16. m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
  17. 【排序】冒泡排序与快速排序(三个版本+非递归图示详解哦)
  18. ArcGIS Pro添加在线遥感底图
  19. 招商银行信用卡还款冲账顺序
  20. Android App通过蒲公英实现更新

热门文章

  1. python发音翻译-python实现在线翻译
  2. 学完python能做什么-学完Python开发可以从事哪些行业?
  3. 2018年python工作好找吗-2018年 Python面试必看的10个问题及答案
  4. 千行代码入门python-要学 Python 需要怎样的基础?
  5. 网卡重启影响nfs吗_nfs常见问题解决办法
  6. 【MYSQL快速入门】常用函数:文本函数
  7. FFMPEG源码分析:avformat_open_input()(媒体打开函数)
  8. HEVC码流简单分析
  9. matlab08a调节字体大小,MATLAB低通滤波器的设计代码
  10. java构造器构造方法_Java构造器(构造方法/constructor)