观察者模式
观察者模式:(发布-订阅模式)定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。
结构图:
Subject类,可翻译为主题或者抽象通知者,一般用一个抽象类或者一个接口实现。
1 abstract class Subject 2 { 3 private IList<Observer> observers = new List<Observer>(); 4 5 //增加观察者 6 public void Attach(Observer observer) 7 { 8 observers.Add(observer); 9 } 10 //移除观察者 11 public void Detach(Observer observer) 12 { 13 observers.Remove(observer); 14 } 15 //通知 16 public void Notify() 17 { 18 foreach (Observer o in observers) 19 { 20 o.Update(); 21 } 22 } 23 }
Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题(抽象通知者)的通知时及时更新自己。
1 abstract class Observer 2 { 3 public abstract void Update(); 4 } 5 6 class ConcreteObserver : Observer 7 { 8 private string name; 9 private string observerState; 10 private ConcreteSubject subject; 11 12 public ConcreteObserver( 13 ConcreteSubject subject, string name) 14 { 15 this.subject = subject; 16 this.name = name; 17 } 18 //更新 19 public override void Update() 20 { 21 observerState = subject.SubjectState; 22 Console.WriteLine("观察者{0}的新状态是{1}", 23 name, observerState); 24 } 25 26 public ConcreteSubject Subject 27 { 28 get { return subject; } 29 set { subject = value; } 30 } 31 }
使用:当一个对象的改变需要同时改变其他对象的时候(而且不知道具体有多少个对象有待改变时),应该考虑使用观察者模式。
PS:观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。