C#委托进阶,事件和委托,一次就看明白,附源码
时间:2022-07-22
本文章向大家介绍C#委托进阶,事件和委托,一次就看明白,附源码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
需求背景
猫叫触发一系列的动作或者说触发一系列事件,猫叫导致狗叫,小孩哭,Mom跑。
代码结构申明
1 /// <summary>
2 /// 接口类
3 /// </summary>
4 public interface IObeject
5 {
6 /// <summary>
7 /// 提供该方法执行一系列继承自该接口的类行为
8 /// </summary>
9 void DoAction();
10 }
1 /// <summary>
2 /// 狗类
3 /// </summary>
4 public class Dog : IObeject
5 {
6 public void DoAction()
7 {
8 this.Wang();
9 }
10 /// <summary>
11 /// 狗叫
12 /// </summary>
13 public void Wang() {
14 Console.WriteLine("狗叫了...");
15 }
16 }
1 /// <summary>
2 /// 孩子类
3 /// </summary>
4 public class Baby : IObeject
5 {
6 public void DoAction()
7 {
8 this.Cry();
9 }
10 /// <summary>
11 /// 小孩吓哭了
12 /// </summary>
13 public void Cry() {
14 Console.WriteLine("小孩吓哭了");
15 }
16
17 }
/// <summary>
/// Mom类
/// </summary>
public class Mom : IObeject
{
public void DoAction()
{
this.Run();
}
/// <summary>
/// 妈妈跑
/// </summary>
public void Run() {
Console.WriteLine("妈妈着急了,Mom Run...");
}
}
1 /// <summary>
2 /// 猫类
3 /// </summary>
4 public class Cat
5 {
6 /// <summary>
7 /// Cat类依赖了多种类型,任何猫类依赖的类型变化都与猫有关,猫类甚至还要控制事件的执行顺序。
8 /// 如果事件需要调整顺序,或者猫依赖的类发生变化都得修改猫类的代码,类与类之间的关系严重耦合。且职责不单一
9 /// 实际上不该如此,猫就是猫,猫只负责Miao,猫只做自己的事,别的事与我无关,需求就是猫Miao了一声,触发一系列
10 /// 动作,至于触发什么动作,与猫无关。
11 /// </summary>
12 public void Miao()
13 {
14 Console.WriteLine("猫叫了一声...");
15 new Dog().Wang();
16 new Baby().Cry();
17 new Mom().Run();
18 }
19
20 private IList<IObeject> _ObserverList = new List<IObeject>();
21
22 public void AddObserver(IObeject obeserver) {
23 this._ObserverList.Add(obeserver);
24 }
25
26 public void MiaoObserver() {
27
28 foreach (var _obeserver in _ObserverList)
29 {
30 _obeserver?.DoAction();
31 }
32 }
33
34 #region 使用委托
35 public Action CatMiaoAction;
36
37 public void MiaoDelegate() {
38
39 this.CatMiaoAction?.Invoke();
40 }
41 #endregion
42
43 #region 使用事件
44 /// <summary>
45 /// 什么是事件?事件是委托的一个实例,如Student的一个实例是张三,并且带有event关键字修饰,事件是一种更安全的特殊委托
46 /// 只能在事件所在的类内部对其赋值和调用(invoke();),不能在外部对其赋值和调用,即使是子类。
47 /// </summary>
48 public event Action CatMiaoActionEvent;
49
50 public void MiaoDelegateHandler()
51 {
52 //this.CatMiaoActionEvent = null;//编译可以通过
53 this.CatMiaoActionEvent?.Invoke();//编译可以通过
54 }
55 #endregion
56 }
57
58 public class MiniCat : Cat
59 {
60 public void Do()
61 {
62 //this.CatMiaoActionEvent = null;//即使是子类,编译不通过,不能赋值
63 //this.CatMiaoActionEvent?.invoke();//即使是子类,编译不通过,不能调用
64 }
65 }
1 static void Main(string[] args)
2 {
3 {
4 new Cat().Miao();
5 }
6 {
7 //去除了猫类对其它类的依赖,把依赖通过抽象转移到外部,事件的触发逻辑交给调用者,与猫
8 //无关,猫作为事件发布者,这是一种观察者模式的运用
9 Cat cat = new Cat();
10 cat.AddObserver(new Dog());
11 cat.AddObserver(new Baby());
12 cat.AddObserver(new Mom());
13 cat.MiaoObserver();
14 Console.WriteLine("**********");
15 }
16 {
17 //使用委托和事件的方式解决该问题,去除了Cat的依赖,Cat稳定了,还可以有多个Cat.CatMiaoAction的实例
18 Cat cat = new Cat();
19 cat.CatMiaoAction += new Dog().Wang;
20 cat.CatMiaoAction += new Baby().Cry;
21 cat.CatMiaoAction += new Mom().Run;
22 cat.MiaoDelegate();
23 Console.WriteLine("**********");
24 }
25 {
26 //使用委托和事件的方式解决该问题,去除了Cat的依赖,Cat稳定了,还可以有多个Cat.CatMiaoActionEvent的实例
27 Cat cat = new Cat();
28 cat.CatMiaoActionEvent += new Dog().Wang;
29 cat.CatMiaoActionEvent += new Baby().Cry;
30 cat.CatMiaoActionEvent += new Mom().Run;
31 cat.MiaoDelegateHandler();
32 Console.WriteLine("**********");
33 }
34 Console.ReadLine();
35 }
- 分布式监控系统Zabbix-3.0.3-完整安装记录 - 添加shell脚本监控
- Flash/Flex学习笔记(52):使用TweenLite
- 设计一个界面,很简单!
- 配置Quartz.net Cluster以及远程管理
- [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
- Flash/Flex学习笔记(49):3D基础
- Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)
- Linux系统批量化安装部署之Cobbler
- 解决JQuery中的ready函数冲突
- 关于监视容器我们了解的5件事
- C#检测SqlServer中某张表是否存在
- Cobbler自动化批量安装linux服务器的操作记录
- Twemproxy——针对MemCached与Redis的代理
- 谁适合学Python?学了Python可以做什么工作?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法