c# 创建委托 消息订阅_发布订阅者模式之C#委托实现

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值