文章出處
文章列表
觀察者模式,也叫發布/訂閱模式(publish/subscribe),監視器模式等。在此種模式中,一個目標物件管理所有相依于它的觀察者物件,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。。
何時能用到它?
此種模式通常被用來實現事件處理系統,例如,當一個數據倉儲操作中,它的添加功能可能會有一個功能,當添加被觸發時,所以訂閱了這個添加事件需求的代碼 塊,都會被觸發執行,在這個過程中,數據倉儲的添加操作就是被觀察者,而所以的訂閱者就是它的觀察者,發被觀察者在某種情況被發起后,所以觀察者的代碼段 都將被執行。
而對于一個發郵件的功能來說,所有訂閱了此功能的模塊,只要系統到某個時間點,發郵件的事件就是被觸發,此時,所有訂閱了此功能的代碼模塊都會被執行,這種場合,我們見到的不少,如很多網站的新聞訂閱,優惠訂閱等等,都可以用到它。對于底層開發人員來說,你的CURD操作,如果希望在操作出錯后,動態記錄日志,事實上,也可以使用這個模式來實現,只要在WEB層或者BLL層訂閱一下記錄日志的事件即可。
觀察者模式的結構圖
觀察者模式實現說明
SubjectBase:被觀察者的基類,它包括了添加觀察者,刪除觀察者,觸發觀察者的功能
Subject:其中一個被觀察者
IObserver:被觀察者對象接口,所以被觀察者都要實現它,其中SubjectBase也會接收一個IObserver對象,用來觸發所有觀察者
Observer1:觀察者1
Observer2:觀察者2
觀察者模式的C#實現
#region 觀察者模式 /// <summary> /// 被觀察者基類 /// </summary> public abstract class SubjectBase { private ArrayList _observers = new ArrayList(); public void Add(IObserver o) { _observers.Add(o); } public void Remove(IObserver o) { _observers.Remove(o); } public void Notify() { foreach (IObserver o in _observers) { o.Notify(); } } } /// <summary> /// 被觀察者(委托) /// </summary> public class Subject : SubjectBase { } /// <summary> /// 觀察者實現接口(事件) /// </summary> public interface IObserver { void Notify(); } /// <summary> /// 觀察者1 /// </summary> public class Observer1 : IObserver { public void Notify() { Console.WriteLine("觀察者1"); } } /// <summary> /// 觀察者2 /// </summary> public class Observer2 : IObserver { public void Notify() { Console.WriteLine("觀察者2"); } } #endregion
測試代碼
Subject subject = new Subject(); subject.Add(new Observer1()); subject.Add(new Observer2()); subject.Notify();
結果如圖
文章列表
全站熱搜