观察者模式--上班玩游戏,老总是怎么知道的?

  1. 注:以下反出现“同学”的地方都使用“C”代替,我自己使用“M”代替,老总“A”。
  2.    前些天一个同学告诉我:“我上班的时候玩游戏,怎么老总知道.难不成他在办公室里装有监视器.”
  3. “呵呵,这个很难说,不过应该是不会的.”M说:。
  4. T:“那老总是怎么知道我玩游戏的呢?”
  5. M:“这个问题还得好好研究下,或许他还可能真的是在办公室的某处装有摄像头监视呢,哈哈!”
  6. T:“是啊,我也这样怀疑过,因为办公室里出了我,别的同事玩游戏他也知道。神了这!”
  7. M:“那他不是一个人可以监视你门多个呀?也,他还玩得高级呢,还弄个一对多的关系出来了。而你办公室里的任何一个人玩游戏他都能准确准时的逮住你们,你们老总够强大的哈!” 
  8. M:“这让我想起了软件设计的知识。”
  9.    观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新。
  10. T:“你是不是做软件做疯了,这也能和软件设计拉上关系?别虾扯了,说正事吧。”
  11. M:“我说的就是正事呀,哎,你娃还是老脾气不改,别人话都没说完你就打断别人自己来插上几句,还是讲点原则撒,让别人说完了你在接到来。你先听到,我说完了你在说。”
  12. M:“你仔细看看我上面提到的软件设计知识点,你们老总可以监视你们多个人,当你们玩游戏他就可以准确准时的逮到你们,用程序来说就是当你们一玩游戏的时候就调用了PlayGame()方法吗?而当PlayGame()方法是被监视起的,当PlayGame()被调用的时候就会自动的通知监视者(你们老总),这样很明显,他就知道你们在拿他的钱吃饭不给他做事,反而在办公室里玩游戏了,逮到你你就该着了。不过你也要调过头想想,老总这样做也是有原因的,毕竟他投资了资本出来是想得到回报的,是吧?”
  13. T:“打住,打住。你呀,还不是老脾气不改,还好意思说我。你看你,一说到软件设计,你就巴不得一口气把你掌握的东西唱完!”
  14. M:“呵呵,彼此彼此!”
  15. ----面向对象设计模式[观察者模式]
  16. T:“说实话,我不做程序好多天,可我还是难忘曾经的那写天!听到你说面这样说,我到是对这个软件设计方案有点兴趣了,你能不能说详细点来听听?”
  17. M:“行啊,难得你有这份兴趣,我就用个示例来给你简单的介绍下吧!”
  18. T:“话说多个朋友多条路,呵呵,多个同学还多个聊天吹牛的,嘘--小点声,别让那家伙听到了。” 
  19. M:“其实无论你是在使用.NET还是java开发,这两个平台的事件模型就是一个典型的观察者模式的体现。我就以.NET平台的C#语言来做个简单示例介绍。”
  20. M:“首先,我们需要定义一个委托,通过委托将两个类的交互进行了绑定,当员工玩游戏的方法PalyGame()调用后,触发委托类型的PlayGame事件,而该事件将被委托给老总(admin)的呼叫老总(Notify)方法处理。”
  21. /// <summary>
  22. /// 定义委托
  23. /// </summary>
  24. public delegate void DelegateMonitorEmployee(object sender, CustomeEvetnArgs e);
  25. M:“你是一个人,用面向对象的思想来说的话,那么你就是一个对象吧?抽象的人类对象,在公司里,你作为一名员工,那我们就计算机语言来抽象出员工这个对象Employee,你要玩游戏,而且在玩游戏的时候还会被老总给逮住,那你得去做一个PlayGame方法吧,这里我们很显然需要定义一个委托类型的事件,把游戏的方法Games()通过事件关联起来。”
  26. //员工类
  27. public class Employee
  28. {
  29.     private string _name;
  30.     public string Name
  31.     {
  32.         get { return _name; }
  33.         set { _name = value; }
  34.     }
  35.     private int _age;
  36.     public int Age
  37.     {
  38.         get { return _age; }
  39.         set { _age = value; }
  40.     }
  41.     /// <summary>
  42.     /// 委托类型的事件
  43.     /// </summary>
  44.     public event DelegateMonitorEmployee PlayGame;
  45.     public void Gages()
  46.     {
  47.         if (PlayGame != null)
  48.         {
  49.             CustomeEvetnArgs e = new CustomeEvetnArgs();
  50.             e.Name = this._name;
  51.             e.Age = this._age;
  52.             PlayGame(this, e);
  53.         }
  54.     }
  55. }
  56. T:“你上面CustomeEvetnArgs这是什么玩意,以前我做程序的时候好象没看到过这个东东,是不是自己定义的?”
  57. M:“不错的吗?会发现问题了?不错,CustomeEvetnArgs是自己定义的一个类,他继承于系统EventArgs类,用来传递消息的,等会你就知道了,你玩游戏就是通过它把你的的名字等信息传递到老总那去的。既然你这么急着知道他是干什么的,那看看下面的定义。”
  58. /// <summary>
  59. /// 事件参数基类EventArgs专门用于传递事件数据
  60. /// 定义了两个成员,通过它可以传递两个数据(Name,Age)
  61. /// </summary>
  62. public class CustomeEvetnArgs:EventArgs
  63. {
  64.     string name = string.Empty;
  65.     public string Name
  66.     {
  67.         get { return name; }
  68.         set { name = value; }
  69.     }
  70.     int age = 0;
  71.     public int Age
  72.     {
  73.         get { return age; }
  74.         set { age = value; }
  75.     }
  76.     public CustomeEvetnArgs()
  77.     { }
  78. }
  79. M:“下面我们来看看老总(Admin)类里是怎么处理的,当员工(Employee)玩游戏(调用了PlayGame)的时候老总是怎么得到通知的。”
  80. //老总类
  81. public class Admin
  82. {
  83.     /// <summary>
  84.     /// 呼叫老总--
  85.     /// 通过CustomeEvetnArgs事件把玩游戏的员工信息传递过来
  86.     /// </summary>
  87.     /// <param name="sender"></param>
  88.     /// <param name="e"></param>
  89.     public void Notify(object sender,CustomeEvetnArgs e)
  90.     {
  91.         StringBuilder resutl = new StringBuilder();
  92.         resutl.Append("员工:" + e.Name + " ");
  93.         resutl.Append("年龄:" + e.Age.ToString() + "岁 ");
  94.         resutl.Append("正在玩游戏! ");
  95.         resutl.Append("时间:" + DateTime.Now.ToString());
  96.         Console.WriteLine(resutl);
  97.     }
  98. }
  99. M:“到这里,整个监视过程我们就完全建立好了。现在是该做实验的时候到了。老同学(Employee),你在去玩游戏试试,看看老总(Admin)是不是可以通过我们上面花这么多的功夫去建立的这个观察(监视)你的系统呢?”
  100. T:“你说得比唱得还好听,就这么几十句代码,有你说的那么神吗?不就不信,好,我去试试。”
  101. --张三(呵呵,前面忘了说,我那同学叫张三,今年22岁了。)打开了电脑,游戏启动。
  102. class Program
  103. {
  104.     static void Main(string[] args)
  105.     {
  106.         Employee employee = new Employee();
  107.         employee.Name = "张三";
  108.         employee.Age = 22;
  109.         Admin admin = new Admin();
  110.         //通过DelegateMonitorEmployee将两个类的交互进行了绑定,当employee.Games方法调用后,
  111.         //触发PlayGame事件,而该事件将被委托给admin的Notify方法处理。
  112.         employee.PlayGame += new DelegateMonitorEmployee(admin.Notify);
  113.         employee.Gages();
  114.     }
  115. }
  116. --这时,老总办公室里的警报声响了,发出了信号;
  117. --小张刚刚启动游戏,突然办公室门开了。进来了一个“人(Admin)”。
  118. A:“张三,你胆子够大的嘛,昨天玩游戏还罚款你100个大洋,你今天还赶玩?等会到我办公室去我们聊一会!”
  119. --哈哈,估计这次我这为同学要被洗白。。。。期待被抄中ing.......
  120. 文章到处结束,希望大家多多支持。

原帖及讨论:http://bbs.bccn.net/thread-213640-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值