1. 什么是委托?
处理诸如int,bool等基本数据类型,它们是数据的类型。委托,是方法的类型。
如 int a; //a可以是1,2,3,4,5.........
那么delegate D;//D相当于int,是一种类型
D d; //声明了变量,d可以是fun1,fun2,fun3........这里funX是函数的名字。
2.如何使用委托?
函数并不像数那么简单直接赋值就可以了,函数有返回值,或者无返回值,还有参数列表。
如果说定义了一个委托,那么这个委托就对应了一种函数(返回值+参数列表),像具有了int和double一样的类型。
为了使得声明委托能够和一种函数对应,我们使用这样的方法声明委托:
public delegate void MyDelegate(int a);//委托的声明,public规定了delegate的可见性
public static void myFunction(int a) //普通方法的声明
{
Console.WriteLine("a=" + a);
}
这样,MyDelegate就对应了一种函数,相当一种函数的类型(对应于数据类型的int,double)。那么使用这个类型就可以声明变量了
static void Main(string[] args)
{
MyDelegate d;
d = myFunction;//将myFunction绑定到d,因为具有相同的返回值和参数列表,所以可以绑定
}
委托的绑定
委托不同于普通数据类型(如int)的一个特性是:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。
看下面的例子:
class Program
{
public delegate void MyDelegate(int a);//委托的声明,public规定了delegate的可见性
public static void myFunction1(int a) //普通方法1的声明
{
Console.WriteLine("a=" + a);
}
public static void myFunction2(int a) //普通方法2的声明
{
Console.WriteLine("a等于:" + a);
}
static void Main(string[] args)
{
MyDelegate d;
d = myFunction1;
d += myFunction2;
d(3);//调用这个委托
Console.ReadLine();
}
}
总结:
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
3. 观察者模式(observer)
事件处理机制的基础是一种叫观察者模式的设计模式。Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。
举个简单的例子:
假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater