今天咱們學習觀察者模式,直接進入主題。
觀察者模式又叫發布模-訂閱(Publish/Subscribe)模式
定義了一種一對多的依賴關系,讓多個觀察對象同時觀察某一個主題對象。這個主題在狀態發生變化時會通知所有的觀察者對象,使它們能夠自動更新自己。
觀察者模式組成
1.抽象主題(Subject類)提供抽象類或者一個接口實現。把所有對觀察者對象的引用保存在一個聚集里,每個主題可以有任意數量的觀察者。抽象主題提供了一個接口,可以增加和刪除觀察者對象.
2.抽象觀察者(Observer)類為所有具體觀察者定義一個接口,在得到主題時更新自己。這個接口叫做更新接口。抽象觀察者用抽象類或者接口實現,更新接口包含一個更新方法(Update)。
3.具體主題(ConcreteSubject)類,存放具體觀察者對象;在具體主題的內部狀態改變時,給所有觀察者發出通知。具體角色用具體子類實現。
4.具體觀察者(ConcreteObserver)類,實現抽象觀察者的更新接口,以便和主題狀態協調,具體觀察者用具體子類實現。
示例:
abstract class Subject { private IList<Observer> observers=new List<Observer>(); //增加觀察者 public void Attach(Observer observer) { observers.Add(observer); } //移除觀察者 public void Detach(Observer observer) { observers.Remove(observer); } //通知 public void Notify() { foreach(Observer o in observers) { o.Update(); } } } abstract class Observer { public abstract void Update(); } class ConcreteSubject:Subject { private string subjectState; //具體被觀察者狀態 public string SubjectState { get{return subjectState;} set{subjectState=value;} } } class ConcreteObserver:Observer { private string name ; private string observerState; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject,string name) { this.subject=subject; this.name=name; } public override void Update() { observerState=subject.SubjectState; Console.WriteLine("觀察者{0}的新狀態是{1}",name,observerState); } public ConcreteSubject Subject { get{return subject;} set{subject=value;} } } static void Main(string[] args) { ConcreteSubject s = new ConcreteSubject(); s.Attach(new ConcreteObserver(s, "X")); s.Attach(new ConcreteObserver(s, "Y")); s.Attach(new ConcreteObserver(s, "Z")); s.SubjectState = "ABC"; s.Notify(); Console.Read(); }
總結:觀察者模式所做的工作其實就是在解除耦合。讓耦合的雙方都依賴於抽象,而不是依賴於具體,從而使得各自的變化都不會影響另一邊的變化。