观察者模式
定义
观察者模式,顾名思义就是观察者对某事物进行观察,当事物状态改变(符合条件)时,通知所有的订阅者,使他们做出对应的反应。
一般可以通过类之间的引用调用来实现、也可以通过事件订阅的方式实现。
类实现方式的类图
类实现方式的代码
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 }
事件通知形式
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
总结
观察者模式,着重于条件触发点到达时对一类对象进行通知,已达到广播通知的效果。
关于类实现、还是事件订阅方式的实现,主要看功能业务,事件订阅方式简化了代码,同时也比较明了。而类实现则增加了耦合,并且要求订阅者有统一基类或者接口,但定义类的功能有时可以照顾到其他的业务实现。