随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

理解委托

1、委托是优化的观察者模式

观察者模式定义了一种一对多的关联关系,subject维护一个observer的集合,每个observer 内部引用subject,每次当subject发生变化,subject 遍历observer集合,通知observer 进行更新。实际上,为了面向抽象编程,会引入抽象subject和抽象observer,这里为了简单说明,就忽略抽象subject和抽象observer。

观察者存在的问题:1、 要求observer具有相同的父类,但现实中,observer可能是风马牛不相及的类。2、 observer更新的方法名相同,但现实中,observer的更新方法名也可能不同。

委托是一个类,在subject内部引用一个委托变量,委托变量可以绑定方法,这些方法的拥有者可以是风马牛不相及的类,方法名也可以不相同,只要这些方法具有相同的参数签名(包括参数的类型、个数、顺序以及返回类型)。从而,委托解决了上述观察者模式存在的问题。

再进一步,委托是如何关联subject和observer的?委托的参数中往往包含了subject和observer感兴趣的数据,因此在observer的方法中可以获取感兴趣的数据,并且可以访问subject。同时,委托既然绑定了多个observer的方法,当然也维护了observer的集合。相当于在subject和observer中间添加了一个中介,对subject和observer进行解耦。


2、委托是类型安全的函数指针

委托类似于C/C++中的函数指针,但二者又有明显的区别。委托对象是真正的对象,可以指向不同类的方法,只要这些方法符合委托的参数签名,同时,委托对象是有状态的,委托的行为不仅受到输入参数的影响,还受到目标对象状态的影响。C/C++函数指针只是单纯的函数入口地址,传递参数后,函数运算。

为什么说,委托是类型安全的函数指针?因为委托必须绑定具有相同参数签名的方法,而函数指针可以指向任何地址,其实任何类型的指针都是int型的,这就导致函数指针可能指向一个无效的地址。

posted on   Andy Niu  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2012年8月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示