文章出處

返回目錄

觀察者模式,也叫發布/訂閱模式(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();

結果如圖

返回目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()