標籤:
1.概念
觀察者模式(有時又被稱為發布-訂閱Subscribe>模式、模型-視圖View>模式、源-收聽者Listener>模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。
2.角色
2.1 抽象主題(Subject):它把所有觀察者對象的引用儲存到一個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個介面,可以增加和刪除觀察者對象。
2.2 具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。
2.3 抽象觀察者(Observer):為所有的具體觀察者定義一個介面,在得到主題通知時更新自己。
2.4 具體觀察者(ConcreteObserver):實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題狀態協調。
3.具體實現之委託實現。
類比的情境:貓叫了,老鼠跑了、主人醒了。
3.1 ISubject 抽象
public delegate void NotifyHandler();
public abstract class ISubject { public event NotifyHandler NotifyEvent; protected void Notify() { if (NotifyEvent != null) NotifyEvent(); } public virtual void Run() { } }
3.2 CatSubject
public class CatSubject : ISubject { public override void Run() { Console.WriteLine("貓叫了..."); this.Notify(); } }
3.3 Observer
public abstract class Observer { protected Observer(ISubject sub) { sub.NotifyEvent += Response; } public abstract void Response(); }
3.4 MouseObserver
public class MouseObserver : Observer { public MouseObserver(ISubject sub) : base(sub) { } public override void Response() { Console.WriteLine("老鼠跑了!"); } }
3.5 MasterObserver
public class Master2Observer : Observer { public Master2Observer(ISubject sub):base(sub) { } public override void Response() { Console.WriteLine("主人醒了...."); } }
3.6 調用
var sub = new CatSubject();var mouse = new MouseObserver(sub);var master = new Master2Observer(sub);sub.Run();
3.7 結果
C#設計模式 - 觀察者模式(使用委託)