经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
观察者模式与.Net Framework中的委托与事件
来源:cnblogs  作者:_天光云影  时间:2018/12/3 10:08:57  对本文有异议

   本文文字内容均选自《大话设计模式》一书。

    解释:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    此模式又叫发布-订阅模式。

    举例:火车到站与乘客下车。

    主题:

  1. 1 using System;
  2. 2 using System.Threading;
  3. 3
  4. 4 namespace DelegateDemo2
  5. 5 {
  6. 6 public class 高速列车
  7. 7 {
  8. 8 public string 车次 { get; set; }
  9. 9 private string[] 途经车站;
  10. 10 private string 当前到站;
  11. 11
  12. 12 public delegate void 到站EventHandler(Object sender, 到站EventArgs e);
  13. 13 public event 到站EventHandler 到站;
  14. 14
  15. 15 public class 到站EventArgs : EventArgs
  16. 16 {
  17. 17 public readonly string 当前到站;
  18. 18 public 到站EventArgs(string 当前到站)
  19. 19 {
  20. 20 this.当前到站 = 当前到站;
  21. 21 }
  22. 22 }
  23. 23
  24. 24 public 高速列车()
  25. 25 {
  26. 26 this.车次 = "G253";
  27. 27 this.途经车站 = new string[] { "青岛站", "济南站", "泰安站", "徐州站", "南京站", "苏州站", "杭州站" };
  28. 28 }
  29. 29
  30. 30 protected void On到站(到站EventArgs e)
  31. 31 {
  32. 32 if (this.到站 != null)
  33. 33 {
  34. 34 this.到站(this, e);
  35. 35 }
  36. 36 }
  37. 37
  38. 38 public void 行驶()
  39. 39 {
  40. 40 for (int i = 0; i < this.途经车站.Length; i++)
  41. 41 {
  42. 42 this.当前到站 = this.途经车站[i];
  43. 43 到站EventArgs e = new 到站EventArgs(this.当前到站);
  44. 44 On到站(e);
  45. 45
  46. 46 Thread.Sleep(1000 * 3);
  47. 47 }
  48. 48 }
  49. 49 }
  50. 50 }

    观察者1:

  1. 1 using System;
  2. 2
  3. 3 namespace DelegateDemo2
  4. 4 {
  5. 5 public class 显示器
  6. 6 {
  7. 7 public void 显示到站信息(Object sender, DelegateDemo2.高速列车.到站EventArgs e)
  8. 8 {
  9. 9 高速列车 高速列车 = (高速列车)sender;
  10. 10 Console.WriteLine("{0}次列车当前已到达{1}。", 高速列车.车次, e.当前到站);
  11. 11 }
  12. 12 }
  13. 13 }

    观察者2:

  1. using System;
  2. namespace DelegateDemo2
  3. {
  4. public class 乘客
  5. {
  6. public string 姓名 { get; set; }
  7. public string 目的地 { get; set; }
  8. public 乘客(string 姓名, string 目的地)
  9. {
  10. this.姓名 = 姓名;
  11. this.目的地 = 目的地;
  12. }
  13. public void 提行李下车(Object sender, DelegateDemo2.高速列车.到站EventArgs e)
  14. {
  15. if (e.当前到站 == this.目的地)
  16. {
  17. Console.WriteLine("乘客({0})已到达目的地{1},提行李下车!", this.姓名, e.当前到站);
  18. }
  19. }
  20. }
  21. }

    客户端:

  1. 1 namespace DelegateDemo2
  2. 2 {
  3. 3 class Program
  4. 4 {
  5. 5 static void Main(string[] args)
  6. 6 {
  7. 7 高速列车 高速列车 = new 高速列车();
  8. 8 显示器 显示器 = new 显示器();
  9. 9
  10. 10 乘客 张三丰 = new 乘客("张三丰", "济南站");
  11. 11 乘客 风清扬 = new 乘客("风清扬", "南京站");
  12. 12 乘客 扫地僧 = new 乘客("扫地僧", "杭州站");
  13. 13
  14. 14 高速列车.到站 += new 高速列车.到站EventHandler(显示器.显示到站信息);
  15. 15 高速列车.到站 += new DelegateDemo2.高速列车.到站EventHandler(张三丰.提行李下车);
  16. 16 高速列车.到站 += new DelegateDemo2.高速列车.到站EventHandler(风清扬.提行李下车);
  17. 17 高速列车.到站 += new DelegateDemo2.高速列车.到站EventHandler(扫地僧.提行李下车);
  18. 18
  19. 19 高速列车.行驶();
  20. 20 }
  21. 21 }
  22. 22 }

    使用情景:当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象有待改变时,应该考虑使用观察者模式。

    【委托】:委托可以看作是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。

    一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。

    而且,一个委托可以搭载多个方法,所有方法被依次唤起。更重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号