C# 事件与委托
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApplication 8 { 9 class Program 10 { 11 static void Main(string[] args) //客户端 12 { 13 Heater t = new Heater(); //初始化Heater类的实例 14 t.Boiled += new BoiledEventHandler(new Monitor().Display);//在监视对象(热水器)中为观察者(显示器)实例方法事件的注册 15 t.BoilingWater();//Heater类实例对Boiled事件的触发,以便更新观察者(显示器)中的数据 16 Console.ReadKey(); 17 } 18 } 19 20 class BoiledEventArgs : EventArgs //事件类,存储观察者对监视对象(热水器)所感兴趣的字段(如Temperature) 21 { 22 public readonly int Tempurature; 23 public BoiledEventArgs(int tempurature) 24 { 25 Tempurature = tempurature; 26 } 27 } 28 delegate void BoiledEventHandler(object sender,BoiledEventArgs e); //定义一个委托 29 class Heater //监视对象(热水器) 30 { 31 int _Temperature;//令观察者(显示器)感兴趣的字段:温度 32 public string Brand = "Midea"; 33 public event BoiledEventHandler Boiled;//事件委托:观察者(显示器)对监视对象(热水器)所调用的方法 34 protected virtual void OnBoiled(BoiledEventArgs e) 35 { 36 if (Boiled != null) 37 { 38 Boiled(this, e);//事件绑定:如客户端(一般指Main函数)已有观察者(显示器)对监视对象(热水器)的事件(Boiled)进行订阅, 39 //则进行对观察者(显示器)数据(Temperature:温度)的更新显示 40 } 41 } 42 43 public void BoilingWater() 44 { 45 for (int i = 0; i <= 100; i++) 46 { 47 _Temperature= i; 48 if (i > 90) 49 { 50 BoiledEventArgs e = new BoiledEventArgs(_Temperature);//事件类的构造函数,传递观察者(显示器)所感兴趣的字段(温度) 51 OnBoiled(e);//对Boiled事件进行触发,以便使观察者(显示器)数据(Temperature:温度)得到更新 52 } 53 } 54 } 55 } 56 57 class Monitor //观察者(显示器) 58 { 59 public void Display(object sender, BoiledEventArgs e) 60 { 61 Heater t = (Heater)sender;//sender,来自Heater类,可以对实例的字段等进行访问, 62 Console.WriteLine("Brand is " + t.Brand);//如访问该热水器的品牌 63 Console.WriteLine("Current temperature is " + e.Tempurature);//观察者(显示器)本身数据的更新显示 64 } 65 } 66 }
参考来自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
作者:CNXY Github:https://www.github.com/cnxy 出处:http://cnxy.me 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出,谢谢! |