委托:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { delegate void mydelegate(string name); //声明委托 class Program2 { public void greetpeople(string name, mydelegate dele1) { dele1(name); } public void greeten(string name) { Console.WriteLine("GoodMorning!"+name); } public void greetcn(string name) { Console.WriteLine("早上好!"+name); } static void Main(string[] args) { #region Program2 p = new Program2(); mydelegate dele1 = new mydelegate(p.greeten); //实例化委托 mydelegate dele2 = new mydelegate(p.greetcn); p.greetpeople("jack", dele1); p.greetpeople("早安", dele2); dele2 = dele1; p.greetpeople("早安", dele2); //委托是可以进行赋值的 //dele1 += p.greetcn; //p.greetpeople("测试", dele1); mydelegate dele3 = p.greetcn; //另一种实例化委托的方法 p.greetpeople("测试", dele3); //实例化 委托的两种方法 一是: new。。。 而是用= 就像下面的例子一样 string str = new string(new char[] { 'a', 'b', 'c' }); string str2 = "abc"; Console.Write("{0} {1} ", str, str2); mydelegate dele4 = p.greetcn; dele4 += p.greeten; dele4 += p.greetcn; //增加委托方法 p.greetpeople("测试1", dele4); dele4 -= p.greeten; //移除委托方法 p.greetpeople("测试2", dele4); Console.Read(); #endregion } } }
事件:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { delegate void mydelegate(string name); //声明委托 class Manager { //public mydelegate mydele1; //在类中 声明一个委托变量使用 public event mydelegate evtMydel; // 事件 public void greetpeople(string name) { if (evtMydel != null) { evtMydel(name); } } } class Program2 { public void greeten(string name) { Console.WriteLine("GoodMorning!"+name); } public void greetcn(string name) { Console.WriteLine("早上好!"+name); } static void Main(string[] args) { Program2 p = new Program2(); Manager m1 = new Manager(); m1.evtMydel += p.greetcn; //注册事件 只能用+= 或者-= m1.evtMydel += p.greeten; m1.evtMydel += new mydelegate(p.greeten); m1.greetpeople("张三"); Console.Read(); } } }
Observer的设计模式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { delegate void mydelegate1(int temp); class heater { //一个烧水的例子 private int temprature; //下面的alert show都和温度有关 public event mydelegate1 evtMydele; //声明事件 public void boidwater() { for (int i = 0; i < 100; i++) { temprature = i; if (temprature > 95) { evtMydele(temprature); // } } } static void Main(string[] args) { heater h = new heater(); h.evtMydele += new alert().makeAlert; h.evtMydele += new show().showAlert; h.boidwater(); Console.Read(); } } class alert { public void makeAlert(int temprature) { Console.WriteLine("滴滴滴,{0}度", temprature); } } class show { public void showAlert(int temprature) { Console.WriteLine("水开了,{0}度", temprature); } } }
理解委托的一种好方式就是把委托当做这样一件事情,它给方法的签名和返回类型指定了名称。就是通过委托可以把一个方法作为一个参数传入另外一个方法使用。