观察者模式

定义

观察者模式,顾名思义就是观察者对某事物进行观察,当事物状态改变(符合条件)时,通知所有的订阅者,使他们做出对应的反应。

一般可以通过类之间的引用调用来实现、也可以通过事件订阅的方式实现。

类实现方式的类图

类实现方式的代码

 1  public class Subject
 2     {
 3         public string State { get; set; }
 4     }
 5 
 6     public class Notifier
 7     {
 8         public IList<Observer> observers = null;
 9         private Subject subject=null;
10         public Notifier(Subject subject)
11         {
12             this.subject = subject;
13             observers = new List<Observer>();
14         }
15         public void ChangeState(string state)
16         {
17             subject.State = state;
18             foreach (var item in observers)
19             {
20                 item.Reflect();
21             }
22         }
23     }
24     public abstract class Observer
25     {
26         //TODO other property...
27 
28         /// <summary>
29         /// 
30         /// </summary>
31         public abstract void Reflect();
32         
33     }
34     public class ObserverA : Observer
35     {
36         public override void Reflect()
37         {
38             Console.WriteLine("A got it");
39         }
40     }
41     public class ObserverB : Observer
42     {
43         public override void Reflect()
44         {
45             Console.WriteLine("B see it");
46         }
47     }
View Code

事件通知形式

 1    public delegate void NotifyHandler();
 2     public class Subject
 3     {
 4         public string State { get; set; }
 5     }
 6     public class Notifier
 7     {
 8         public event NotifyHandler Nofify;
 9         private Subject subject = null;
10         public Notifier(Subject subject )
11         {
12             this.subject=subject;
13         }
14         public void OnChangeState(string state)
15         {
16             subject.State = state;
17             if (Nofify != null)
18             {
19                 Nofify();
20             }
21         }
22     }
23     public class Observer
24     {
25         public Observer(Notifier notifier)
26         {
27             notifier.Nofify += notifier_Nofify;
28         }
29 
30         void notifier_Nofify()
31         {
32             //TODO...reflect
33         }
34     
View Code

总结

观察者模式,着重于条件触发点到达时对一类对象进行通知,已达到广播通知的效果。

关于类实现、还是事件订阅方式的实现,主要看功能业务,事件订阅方式简化了代码,同时也比较明了。而类实现则增加了耦合,并且要求订阅者有统一基类或者接口,但定义类的功能有时可以照顾到其他的业务实现。

 

posted @ 2015-10-13 00:42  Tim_et  阅读(274)  评论(0编辑  收藏  举报