理解委托

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型的,这就导致函数指针可能指向一个无效的地址。

你可能感兴趣的:(理解)