zoukankan      html  css  js  c++  java
  • 发布订阅者模式之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 委托与发布订阅者模式
      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 }

  • 相关阅读:
    hdu 2544 单源最短路问题 dijkstra+堆优化模板
    CImg、libjpeg--介绍、配置(操作JPEG)
    【Android归纳】开发中应该注意的事项
    iOS測试——置换測试: Mock, Stub 和其它
    <html>
    系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式
    hdu 1038 Biker&#39;s Trip Odometer(水题)
    java泛型
    从头认识Spring-2.1 自己主动装配(2)-byType(2)
    11.2.0.3 RAC(VCS)节点crash以及hang的问题分析
  • 原文地址:https://www.cnblogs.com/armyfai/p/3598099.html
Copyright © 2011-2022 走看看