设为首页 加入收藏

TOP

设计模式-行为型-观察者模式(二)
2019-10-09 19:58:54 】 浏览:118
Tags:设计模式 行为 观察者 模式
o);
30 31 /// <summary> 32 /// 删除观察者 33 /// </summary> 34 /// <param name="o"></param> 35 public abstract void Detach(Observer o); 36 37 /// <summary> 38 /// 通知观察者 39 /// </summary> 40 public abstract void Notify(); 41 } 42 43 /// <summary> 44 /// 同学下课做事情:抽象观察者 45 /// </summary> 46 internal abstract class Observer 47 { 48 public abstract void DoSomeThings(); 49 } 50 51 /// <summary> 52 /// 下课铃声:具体目标 53 /// </summary> 54 internal class FinishClassBell : Bell 55 { 56 private System.Collections.Generic.List<Observer> observers 57 = new System.Collections.Generic.List<Observer>(); 58 59 public override void Attach(Observer o) 60 { 61 if (o != null) 62 observers.Add(o); 63 } 64 65 public override void Detach(Observer o) 66 { 67 if (o != null) 68 observers.Remove(o); 69 } 70 71 public override void Notify() 72 { 73 Console.WriteLine("铃声响了..."); 74 foreach (var observer in observers) 75 { 76 observer.DoSomeThings(); 77 } 78 } 79 } 80 81 /// <summary> 82 /// 小明同学 83 /// </summary> 84 internal class XiaoMing : Observer 85 { 86 public override void DoSomeThings() 87 { 88 Console.WriteLine("小明同学:下课打篮球"); 89 } 90 } 91 92 /// <summary> 93 /// 小红同学 94 /// </summary> 95 internal class XiaoHong : Observer 96 { 97 public override void DoSomeThings() 98 { 99 Console.WriteLine("小红同学:呜呜呜,还有一节课"); 100 } 101 } 102 103 /// <summary> 104 /// 小王同学 105 /// </summary> 106 internal class XiaoWang : Observer 107 { 108 public override void DoSomeThings() 109 { 110 Console.WriteLine("小王同学:饿死了,开吃..."); 111 } 112 }

观察者模式的应用场景:

  1)对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。

  2)当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

观察者模式的优缺点:

  优点:观察者和被观察者是抽象耦合的;建立的一套触发机制。

  缺点:

    1)如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

    2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

    3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

.NET中观察者模式的应用:

 1 // 委托充当订阅者接口类
 2 public delegate void NotifyEventHandler(object sender);
 3 
 4 // 抽象订阅号类
 5 public class TenXun
 6 {
 7     public NotifyEventHandler NotifyEvent;
 8 
 9     public string Symbol { get; set; }
10     public string Info { get; set; }
11     public TenXun(string symbol, string info)
12     {
13         this.Symbol = symbol;
14         this.Info = info;
15     }
16 
17     // 新增对订阅号列表的维护操作
18     public void AddObserver(NotifyEventHandler ob)
19     {
20         NotifyEvent += ob;
21     }
22     // 删除对订阅号列表的维护操作
23     public void RemoveObserver(NotifyEventHandler ob)
24     {
25         NotifyEvent -= ob;
26     }
27     // 推送消息
28     public void Update()
29     {
30         if (NotifyEvent != null)
31         {
32             NotifyEvent(this);
33         }
34     }
35 }
36 
37 // 具体订阅号类
38 public class TenXunGame : TenXun
39 {
40     public TenXunGame(string symbol, string info)
41         : base(symbol, info)
42     {
43     }
44 }
45 
46 // 具体订阅者类
47 public class Subscriber
48 {
49     public string Name { get; set; }
50     public Subscriber(string name)
51     {
52         this.Name = name;
53     }
54 
55     public void ReceiveAndPrint(Object obj)
56     {
57         TenXun tenxun = obj as TenXun;
58 
59         if (tenxun != null)
60         {
61             Console.WriteLine("Notified {0} of {1}'s" + " Info is: {2}", Name, tenxun.Symbol, tenxun.Inf
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式-行为型-状态模式 下一篇从无到有,构建GIS + BIM大厦

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目