1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Text;5 usingSystem.Threading.Tasks;6
7 namespace委托与发布订阅者模式8 {9
10 /**11 * 机器Machine为被订阅者,维修工Repairer为订阅者12 * 工人(订阅者)注册机器的不同事件,并注册回调函数以当相应事件发生时进行处理13 * 不同的工人可以只关注他们各自感兴趣的事件14 */
15 //机器类
16 public classMachine17 {18 //机器是否正常工作状态
19 public bool IsWorkWell { get; set; }20
21 //机器故障事件委托
22 public delegate void MachineBroken(stringbrokenMsg);23 public eventMachineBroken MachineBrokenEvent;24
25 //机器正常工作事件委托
26 public delegate void MachineWorkWell(stringmsg);27 public eventMachineWorkWell MachineWorkWellEvent;28
29 //机器运作
30 public voidRun()31 {32 IsWorkWell = false; //设置机器出故障
33
34 if (MachineBrokenEvent != null) //有订阅者注册机器故障事件
35 {36 if (!IsWorkWell)37 MachineBrokenEvent("机器出故障了,速度过来看下啊,亲~");38 }39
40 IsWorkWell = true; //设置机器恢复正常
41
42 if (MachineWorkWellEvent != null) //有订阅者注册机器运行正常事件
43 {44 if(IsWorkWell)45 MachineWorkWellEvent("机器正常运作,不用担心,亲~");46 }47 }48
49 //public void OnMachineBrokenEvent(string brokenmsg)50 //{51 //MachineBroken handler = machineBrokenEvent;52 //if (handler != null) handler(brokenmsg);53 //}54
55 //public void OnMachineWorkWellEvent(string msg)56 //{57 //MachineWorkWell handler = machineWorkWellEvent;58 //if (handler != null) handler(msg);59 //}
60 }61
62 public interfaceIWorker63 {64 string Name { get; set; }65 void DoJob(stringmsg);66 }67
68 //BusyWorker注册机器故障事件
69 public classBusyWorker: IWorker70 {71 public string Name { get; set; }72
73 public void DoJob(stringmsg)74 {75 Console.WriteLine(string.Format("{0}: 收到信息 < {1} > !马上过来处理,稍等啊~", Name, msg));76 }77 }78
79 //IdleWorker注册机器正常工作事件
80 public classIdleWorker: IWorker81 {82 public string Name { get; set; }83
84 public void DoJob(stringmsg)85 {86 Console.WriteLine(string.Format("{0}: 收到信息 < {1} > !非常好,这样我就可以多睡会了~", Name, msg));87 }88 }89
90 public classSubscriberPatternViaDelegate91 {92 static void Main(string[] args)93 {94 Machine machine = newMachine();95
96 IWorker busyWorker = newBusyWorker();97 busyWorker.Name = "Busy Worker";98
99 IWorker idleWorker = newIdleWorker();100 idleWorker.Name = "Idle Worker";101
102 machine.MachineBrokenEvent += newMachine.MachineBroken(busyWorker.DoJob);103 machine.MachineWorkWellEvent += newMachine.MachineWorkWell(idleWorker.DoJob);104
105 ///
106 //下面开始验证是否可以为一个事件添加多个订阅者
107 IWorker busyWorker2 = newBusyWorker();108 busyWorker2.Name = "Busy Worker 2";109 machine.MachineBrokenEvent += newMachine.MachineBroken(busyWorker2.DoJob);110 //试验结果是可以的111 //同样可以使用静态委托,静态委托的好处之一是节省了内存空间
112 ///
113
114 machine.Run(); //机器开始运作
115
116 Console.ReadLine();117 }118 }119 }