中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

說(shuo)說(shuo)設(she)計模式~觀(guan)察者(zhe)模式(Observer)

返回目錄

觀(guan)察者(zhe)模(mo)式,也叫發布/訂閱模(mo)式(publish/subscribe),監視器(qi)模(mo)式等。在此(ci)種模(mo)式中,一個(ge)目(mu)標物件(jian)管(guan)理所有相依(yi)于(yu)它的(de)觀(guan)察者(zhe)物件(jian),并(bing)且在它本(ben)身(shen)的(de)狀(zhuang)態改變(bian)時主動發出(chu)通知。這(zhe)通常透(tou)過呼叫各觀(guan)察者(zhe)所提供的(de)方(fang)法(fa)來實(shi)現。。

何時能用到它?

此種(zhong)模(mo)式(shi)通(tong)常被(bei)用來(lai)實(shi)現事件處理系(xi)統,例如,當(dang)一個(ge)數據倉(cang)儲操作中(zhong),它的(de)添(tian)(tian)加(jia)功能可(ke)能會有一個(ge)功能,當(dang)添(tian)(tian)加(jia)被(bei)觸發時,所以(yi)訂閱了這個(ge)添(tian)(tian)加(jia)事件需求的(de)代碼(ma) 塊,都(dou)(dou)會被(bei)觸發執(zhi)(zhi)行,在這個(ge)過(guo)程中(zhong),數據倉(cang)儲的(de)添(tian)(tian)加(jia)操作就是(shi)被(bei)觀察者,而所以(yi)的(de)訂閱者就是(shi)它的(de)觀察者,發被(bei)觀察者在某種(zhong)情況(kuang)被(bei)發起后,所以(yi)觀察者的(de)代碼(ma)段 都(dou)(dou)將(jiang)被(bei)執(zhi)(zhi)行。

而對于(yu)一個(ge)(ge)發郵件的(de)(de)(de)功能來說,所(suo)有(you)訂(ding)閱了此(ci)功能的(de)(de)(de)模(mo)(mo)塊,只要系統到某個(ge)(ge)時間點,發郵件的(de)(de)(de)事(shi)件就(jiu)是被觸(chu)發,此(ci)時,所(suo)有(you)訂(ding)閱了此(ci)功能的(de)(de)(de)代(dai)碼模(mo)(mo)塊都(dou)會被執行,這種場合,我們見到的(de)(de)(de)不少(shao),如很多網站(zhan)的(de)(de)(de)新聞訂(ding)閱,優(you)惠訂(ding)閱等等,都(dou)可以(yi)用(yong)到它。對于(yu)底層(ceng)開發人員(yuan)來說,你的(de)(de)(de)CURD操作(zuo),如果希望在操作(zuo)出錯后,動態記(ji)錄日(ri)(ri)志(zhi),事(shi)實(shi)上,也可以(yi)使用(yong)這個(ge)(ge)模(mo)(mo)式來實(shi)現,只要在WEB層(ceng)或者BLL層(ceng)訂(ding)閱一下記(ji)錄日(ri)(ri)志(zhi)的(de)(de)(de)事(shi)件即(ji)可。

觀察者模式的結構圖

觀察者模式實現說明

SubjectBase:被觀(guan)察者(zhe)的(de)基類,它包括了(le)添加觀(guan)察者(zhe),刪除觀(guan)察者(zhe),觸發觀(guan)察者(zhe)的(de)功能

Subject:其中一(yi)個被觀(guan)察(cha)者(zhe)

IObserver:被(bei)觀(guan)察者(zhe)對(dui)象(xiang)接口,所以被(bei)觀(guan)察者(zhe)都要實現它,其中SubjectBase也會接收(shou)一個IObserver對(dui)象(xiang),用來(lai)觸(chu)發所有觀(guan)察者(zhe)

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>
    /// 觀察(cha)者實現接口(kou)(事件)
    /// </summary>
    public interface IObserver
    {
        void Notify();
    }
    /// <summary>
    /// 觀察者1
    /// </summary>
    public class Observer1 : IObserver
    {
        public void Notify()
        {
            Console.WriteLine("觀察者1");
        }
    }
    /// <summary>
    /// 觀察(cha)者2
    /// </summary>
    public class Observer2 : IObserver
    {
        public void Notify()
        {
            Console.WriteLine("觀察(cha)者2");
        }
    }
    #endregion

測試代碼

            Subject subject = new Subject();
            subject.Add(new Observer1());
            subject.Add(new Observer2());
            subject.Notify();

結果如圖

返回目錄

posted @ 2014-08-05 09:38  張占嶺  閱讀(3299)  評論(0)    收藏  舉報