复制代码
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace 委托与发布订阅者模式
  8 {
  9 
 10     /**
 11      * 机器Machine为被订阅者,维修工Repairer为订阅者
 12      * 工人(订阅者)注册机器的不同事件,并注册回调函数以当相应事件发生时进行处理
 13      * 不同的工人可以只关注他们各自感兴趣的事件
 14      */
 15     // 机器类
 16     public class Machine
 17     {
 18         // 机器是否正常工作状态
 19         public bool IsWorkWell { get; set; }
 20 
 21         // 机器故障事件委托
 22         public delegate void MachineBroken(string brokenMsg);
 23         public event MachineBroken MachineBrokenEvent;
 24 
 25         // 机器正常工作事件委托
 26         public delegate void MachineWorkWell(string msg);
 27         public event MachineWorkWell MachineWorkWellEvent;
 28 
 29         // 机器运作
 30         public void Run()
 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 interface IWorker
 63     {
 64         string Name { get; set; }
 65         void DoJob(string msg);
 66     }
 67 
 68     // BusyWorker注册机器故障事件
 69     public class BusyWorker: IWorker
 70     {
 71         public string Name { get; set; }
 72 
 73         public void DoJob(string msg)
 74         {
 75             Console.WriteLine(string.Format("{0}: 收到信息 < {1} > !马上过来处理,稍等啊~", Name, msg));
 76         }
 77     }
 78 
 79     // IdleWorker注册机器正常工作事件
 80     public class IdleWorker: IWorker
 81     {
 82         public string Name { get; set; }
 83 
 84         public void DoJob(string msg)
 85         {
 86          Console.WriteLine(string.Format("{0}: 收到信息 < {1} > !非常好,这样我就可以多睡会了~", Name, msg));   
 87         }
 88     }
 89 
 90     public class SubscriberPatternViaDelegate
 91     {
 92         static void Main(string[] args)
 93         {
 94             Machine machine = new Machine();
 95 
 96             IWorker busyWorker = new BusyWorker();
 97             busyWorker.Name = "Busy Worker";
 98 
 99             IWorker idleWorker = new IdleWorker();
100             idleWorker.Name = "Idle Worker";
101 
102             machine.MachineBrokenEvent += new Machine.MachineBroken(busyWorker.DoJob);
103             machine.MachineWorkWellEvent += new Machine.MachineWorkWell(idleWorker.DoJob);
104 
105             ///////////////////////////////////////////////////////////////////////////////////////////
106             // 下面开始验证是否可以为一个事件添加多个订阅者
107             IWorker busyWorker2 = new BusyWorker();
108             busyWorker2.Name = "Busy Worker 2";
109             machine.MachineBrokenEvent += new Machine.MachineBroken(busyWorker2.DoJob);
110             // 试验结果是可以的
111             // 同样可以使用静态委托,静态委托的好处之一是节省了内存空间
112             ///////////////////////////////////////////////////////////////////////////////////////////
113 
114             machine.Run();  // 机器开始运作
115 
116             Console.ReadLine();
117         }
118     }
119 }
复制代码
posted on   feichexia  阅读(2230)  评论(0)    收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示