//public event SecondChangeHandler OnSecondChange; 若将委托加上event,则视作是事件,不是委托,外围就不能直接对OnSecondChange传值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace EventClock { //一个存放事件信息的类 //存放这Clock类中的信息,和其他状态信息 public class TimeInfoEventArg : EventArgs { public TimeInfoEventArg(int hour, int minute, int second) { this.hour = hour; this.minute = minute; this.second = second; } public readonly int hour; public readonly int minute; public readonly int second; } //中心类:其他类要订阅的类 //发布一个委托 //OnSecondChange public class Clock { private int hour; private int minute; private int second; //订阅这必须实现的委托 public delegate void SecondChangeHandler(object clcok, TimeInfoEventArg timeInformation); //委托实例 public SecondChangeHandler OnSecondChange; //设置始终运行,每一秒都触发一个事件 public void Run() { for (; ; ) { //休眠10秒 Thread.Sleep(10); //获取当前时间 System.DateTime dt = System.DateTime.Now; //如秒钟改变,通知订阅者 if (dt.Second != second) { //创建TimeInfoEventArg对象,传给订阅者 TimeInfoEventArg timeInformation = new TimeInfoEventArg(dt.Hour,dt.Minute,dt.Second); //如果有订阅者,通知他们 if (OnSecondChange != null) { OnSecondChange(this, timeInformation); } } this.second = dt.Second; this.minute = dt.Minute; this.hour = dt.Hour; } } } //一个订阅者,DisplayClock订阅 //时钟事件,DisplayClock任务是显示当前时间 public class DisplayClock { //对于给定的时钟,订阅其他OnSecondChange事件 public void Subscribe(Clock theClock) { theClock.OnSecondChange += new Clock.SecondChangeHandler(TimeHasChanged); } //实现委托功能的方法 public void TimeHasChanged(object clcok, TimeInfoEventArg timeInformation) { Console.WriteLine("Current time: {0}:{1}:{2}", timeInformation.hour.ToString(), timeInformation.minute.ToString(), timeInformation.second.ToString()); } } //另一个订阅者,其任务写入文件 public class LogCurrentTime { public void Subscribe(Clock theClock) { theClock.OnSecondChange += new Clock.SecondChangeHandler(WriteLogEntry); } //此方法应该写入文件 //写到控制台是为了看到对象不保存状态的效果 public void WriteLogEntry( object theClcok, TimeInfoEventArg ti) { Console.WriteLine("logging to file: {0}:{1}:{2}", ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString()); } } class Program { static void Main(string[] args) { Clock theClock = new Clock(); //创建时钟对象,订阅刚刚创建的时钟 DisplayClock dc = new DisplayClock(); dc.Subscribe(theClock); //创建Log对对象 LogCurrentTime lct = new LogCurrentTime(); lct.Subscribe(theClock); theClock.Run(); Console.ReadLine(); } } }
//匿名方法,无需在注册实例委托
public void Subscribe(Clock theClock) { theClock.OnSecondChange += delegate(object clcok, TimeInfoEventArg timeInformation) { Console.WriteLine("Current time: {0}:{1}:{2}", timeInformation.hour.ToString(), timeInformation.minute.ToString(), timeInformation.second.ToString()); }; }