简单谈一下对委托的认识,算是对这篇博客( 这里)的理解和概括吧!
委托(Delegate)首先可以看做一个特殊的类,而一些函数是他的变量取值范围。
如声明一个委托:public delegate void GreetingDelegate(string name);那么我们在别的函数中把函数名当做变量传进来,这样子就可以调用相应的函数了。委托应该先声明才能用,注意作用范围。在任意函数里就可以用这个委托了。public void GreetingPeople(string name, GreetingDelegate MakeGreeting); 第二个参数就可以赋值为不同的函数名。可以这样子 调用这个函数,GreetingPeople("Bruce", ChineseGreering); 或者 GreetingPeople(string name, EnglishGreeting); 注意这里的两个函数 ChineseGreeting 和 EnglishGreeting 得和GreetingDelegate的类型一样(返回值,参数)。
我们可以声明一个委托类型,并把函数赋值(或者说改叫绑定了)过来,如 GreetingDelegate delegate1; delegate1 = EnglishGreeting; delegate1 += ChineseGreeting; 这样子可以同时调用两个函数了,当然,这里的参数是一样的。
这里的 delegate1 既然是一个特殊的函数,那么就可以像函数那样直接调用:delegate1("Bruce"); 效果是一样的。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { public delegate void GreetingDelegate(string name); class Program { private static void EnglishGreeting(string name) { Console.WriteLine("Good morning! " + name); } private static void ChineseGreeing(string name) { Console.WriteLine("您好! " + name); } private static void Greeting(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } static void Main(string[] args) { GreetingDelegate delegate1, delegate2; delegate1 = ChineseGreeing; delegate1 += EnglishGreeting; delegate2 = EnglishGreeting; Greeting("张小彬", delegate1); Greeting("Bruce", delegate2); Console.ReadKey(); } } }
事件(Event)是一个特殊的委托变量,只是封装了委托类型的变量。
event 和 delegate1 只是访问权相不一样,对委托的变量,类型定义为public(太暴露)和private(失去作用)都不合适,于是event出现了。事件变量(或者说委托变量)在类的内部相当于是私有的,在外部只能有+=和-=操作。
Observer设计模式
Observer设计模式有两类身份,一个叫做Subject,即目标,监视的对象;另一个叫做Observer,即监视者。Subject一旦有某些特定的行为(如学生,作弊的行为),那么注册过的Observer会相应该行为(如老师,立刻过去没收考卷)。Observer设计模式是一种松耦合的设计模式。我们一般在Subject中定义事件(Event)和触发规则。下面是一个加热器的例子,显然不符合微软的规范,但是对理解概念很有帮助
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { public class Heater { private int temperature; public delegate void NowHandler(string param); public event NowHandler MyEvent; public void heat() { for (int i = 0; i <= 100; ++i) { temperature = i; if (temperature > 95) { MyEvent(i + ""); } } } } public class Alarm { public void AlarmNow(string param) { Console.WriteLine("Alarm: Fire! Fire!" + param); } } public class Display { public void DisplayNow(string param) { Console.WriteLine("Display: Fire! Fire!" + param); } } class Program { static void Main(string[] args) { Heater heater = new Heater(); Alarm alarm = new Alarm(); Display display = new Display(); heater.MyEvent += alarm.AlarmNow; heater.MyEvent += display.DisplayNow; heater.heat(); Console.ReadKey(); } } }