亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式-觀察者模式

2019-11-14 15:51:43
字體:
來源:轉載
供稿:網友

   1:觀察者模式無疑是觀察。舉一個例子來說明一下觀察者模式。比喻現在要開聯合國(主題)大會,那么現在各國國家派出代表去參加(此時各國代表就是觀察者)。代表把聯合國商討的結果帶回來傳遞給國內人民,這個過程就是觀察者模式??聪聢D

下面開始編碼:

第一步:我們先看被觀察者(就是主題),被觀察者有什么特性呢,首先有觀察者就是add,同時呢這個觀察者不想觀察了那就撤銷delete,還有呢就是觀察者觀察到好的東西要通知告訴上層領導

那么這個接口我們就可以定義了

/// <summary>    /// 主題接口    /// </summary>    public interface ISubject    {        /// <summary>        /// 注冊參加的代表        /// </summary>        /// <param name="observer">代表</param>        void Add(string Name,IObserver observer);        /// <summary>        /// 刪除參加的代表        /// </summary>        /// <param name="observer"></param>        void Delete(string Name, IObserver observer);        /// <summary>        /// 通知各國的代表        /// </summary>        void Notify();    }

第二步:我們該定義觀察者了。觀察者要干嘛呢,就是觀察(其實就是監聽,像不像奸細)得到信息了趕緊就去匯報,所以接口就比較好定義了就是傳遞信息(當然實際項目中就是得到信號以后你自己的操作)

/// <summary>    /// 觀察者(這里指的是各國派的代表)    /// </summary>    public interface IObserver    {        /// <summary>        /// 代表通過本國民眾        /// </summary>        void UpdateHoliday(string Message);    }

第三步:實現被觀察者

/// <summary>    /// 實現主題    /// </summary>    public class Subject : ISubject {        PRivate Dictionary<string, IObserver> allObservers = new Dictionary<string, IObserver>(5);        /// <summary>        /// 通過信息        /// </summary>        public string PublishInfo { get; set; }        /// <summary>        /// 注冊代表        /// </summary>        /// <param name="Name">代表名稱</param>        /// <param name="observer"></param>        public void Add(string Name, IObserver observer) {            if (allObservers.ContainsKey(Name)) {                allObservers[Name] = observer;            }            else {                allObservers.Add(Name, observer);            }        }        /// <summary>        /// 刪除代表        /// </summary>        /// <param name="Name">代表名稱</param>        /// <param name="observer"></param>        public void Delete(string Name, IObserver observer) {            if (allObservers.ContainsKey(Name)) {                allObservers.Remove(Name);            }        }        /// <summary>        /// 通知各國代表        /// </summary>        public void Notify() {            foreach (var observer in allObservers) {                observer.Value.UpdateHoliday(PublishInfo);            }        }

這里面的邏輯自己可以根據項目需要來定義

第四步:實現觀察者

/// <summary>    /// 日本    /// </summary>    public class JapanObserver : IObserver    {        /// <summary>        /// 把假日更新        /// </summary>        /// <param name="Message"></param>        public void UpdateHoliday(string Message)        {            Console.WriteLine("我是日本代表 通過廣告轉告民眾:{0}", Message);        }    }    /// <summary>    /// 美國    /// </summary>    public class AmericaObserver : IObserver {        public void UpdateHoliday(string Message) {            Console.WriteLine("我是美國代表 通過廣播轉告民眾:{0}", Message);        }    }/// <summary>    /// 中國    /// </summary>    public class ChinaObserver : IObserver {        public void UpdateHoliday(string Message) {            Console.WriteLine("我是中國代表 通過電視轉告民眾:{0}", Message);        }    }/// <summary>    /// 英國    /// </summary>    public class BritishObserver : IObserver {        public void UpdateHoliday(string Message) {            Console.WriteLine("我是英國代表 通過報紙轉告民眾:{0}", Message);        }    }/// <summary>    /// 德國    /// </summary>    public class GermanyObserver : IObserver {        public void UpdateHoliday(string Message) {            Console.WriteLine("我是德國代表 通過媒體轉告民眾:{0}", Message);        }    }

這里有5個不同的觀察者,因為他們來自不同的國家(項目中可以根據實際情況)

第五步:運行看下結果

 總結:觀察者模式定義了對象之間的一種聯系,使得當一個對象改變狀態時,所有其他對象可以相應的被通知到。通常,系統有一個新狀態發布者,以及許多想要得到狀態通知的訂閱者。

2:我們發現這個和事件委托很像,也是定義一個委托,然后在定義一個事件,當狀態發生改變的時候觸發事件。下面看看編碼

A:主題

/// <summary>    /// 委托/事件實現主題    /// </summary>    public class SubjectEventHandler    {        //定義一個發送信息的委托        public delegate void SendMessage(string str);        //定義一個事件        public event SendMessage SendTest;                /// <summary>        /// 公布信息        /// </summary>        public string PublishInfo { get; set; }        /// <summary>        /// 發送信息        /// </summary>        public void Notify()        {                        if (SendTest!=null)            {                SendTest(PublishInfo);            }        }    }

 B:得到信息后的操作

/// <summary>    /// 響應事件后的操作    /// </summary>    public class ObserverEventHandler {        public void Display(string str)        {            Console.WriteLine(str);        }    }

C:觸發事件

SubjectEventHandler subjectEvent = new SubjectEventHandler();            subjectEvent.PublishInfo = "實施2.5天假期制";            ObserverEventHandler observerEvent = new ObserverEventHandler();                        subjectEvent.SendTest += new SubjectEventHandler.SendMessage(observerEvent.Display);            subjectEvent.Notify();

D:顯示結果

 

3:在前面我們說過action也是用過表示委托的下面我們來看看action的操作

A:定義主題

/// <summary>    /// 委托/事件實現主題    /// </summary>    public class SubjectEventHandler    {        public Action<string> SendAction;         /// <summary>        /// 公布信息        /// </summary>        public string PublishInfo { get; set; }        /// <summary>        /// 發送信息        /// </summary>        public void Notify() {            if (SendAction != null) {                SendAction(PublishInfo);            }        }

B:

/// <summary>    /// 響應事件后的操作    /// </summary>    public class ObserverEventHandler {        public void Display(string str)        {            Console.WriteLine(str);        }    }

C:響應

    SubjectEventHandler subjectEvent = new SubjectEventHandler();            subjectEvent.PublishInfo = "實施2.5天假期制";            ObserverEventHandler observerEvent = new ObserverEventHandler();            Action<string> action = observerEvent.Display;            subjectEvent.SendAction = action;                subjectEvent.Notify();

同樣實現了2中的效果

總結:個人覺得如果項目較大,而且偏向于有用戶管理信息,用觀察者模式。如果是比較小的項目或者只是觸發一下事件就可以搞定可以使用事件委托。比喻我們要獲取數據庫某一個表中更新的數量,我們就不必每一次就去讀取數據庫,而是緩存中讀取,但是缺點就是沒有達到及時性,那么現在我們就可以用委托,每次更新一條數據那么就觸發一次事件去數據庫讀取來更新緩存即可


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青青久久av北条麻妃黑人| 亚洲欧美综合区自拍另类| 91在线中文字幕| 91精品国产91久久久久福利| 精品露脸国产偷人在视频| 亚洲免费电影一区| 黑人欧美xxxx| 97视频免费在线观看| 国产一区二区丝袜| 成年无码av片在线| 欧美黑人一区二区三区| 亚洲人成在线电影| 国产999精品久久久影片官网| 欧美电影在线观看完整版| 亚洲精品一区在线观看香蕉| 成人黄色大片在线免费观看| 伊人久久男人天堂| 久久精品久久久久久国产 免费| 欧美又大又粗又长| 国产精品爽爽ⅴa在线观看| 久久在线视频在线| 亚洲女性裸体视频| 国模吧一区二区三区| 91精品视频网站| 精品久久久91| 国产精品扒开腿爽爽爽视频| 青青青国产精品一区二区| 欧美性猛交xxxx久久久| 国产亚洲综合久久| 色99之美女主播在线视频| 国产成人一区二区三区电影| 久久精品99久久久香蕉| 欧美性受xxxx黑人猛交| 国产女精品视频网站免费| 欧美又大又硬又粗bbbbb| 亚洲免费av电影| 亚洲一区制服诱惑| 中文字幕久久精品| www.久久久久久.com| 成人午夜激情网| 久久久久久久久国产精品| 欧美日韩中文字幕综合视频| 亚洲香蕉av在线一区二区三区| 91在线免费观看网站| 懂色av中文一区二区三区天美| 久久精品人人爽| 亚洲美女久久久| 国产精品视频精品视频| 国产亚洲欧洲在线| 国产欧美精品一区二区三区-老狼| 国产日韩在线免费| 国产精品成人观看视频国产奇米| 亚洲天堂免费视频| 久久精品国产视频| 国产精品色视频| 欧美日韩中文字幕| 国内精品久久久久久影视8| 成人乱人伦精品视频在线观看| 亚洲男人天堂视频| 国产精品对白刺激| 国产精品久久久久999| 欧美日韩国产精品专区| 欧美视频在线看| 俺去亚洲欧洲欧美日韩| 国产亚洲精品久久久| 久久手机免费视频| 亚洲一品av免费观看| 国产日产久久高清欧美一区| 久久久久久国产精品久久| 国产免费一区二区三区香蕉精| 两个人的视频www国产精品| 国内久久久精品| 久久久久久国产精品| 日韩中文字幕免费看| 日韩美女免费观看| 精品国产一区二区在线| 成人黄色网免费| 久久在线免费观看视频| 欧洲中文字幕国产精品| 欧美日产国产成人免费图片| 国产999精品久久久影片官网| 欧美一区二区视频97| 精品国产欧美一区二区五十路| 美女性感视频久久久| 久久久精品2019中文字幕神马| 久久久久在线观看| 日韩经典中文字幕在线观看| 日韩视频中文字幕| 亚洲精品美女网站| 久久久www成人免费精品| 一区二区三区国产在线观看| 亚洲精品影视在线观看| 国产精品久久久久999| 综合av色偷偷网| 911国产网站尤物在线观看| 亚洲免费中文字幕| 日韩精品黄色网| 久久99精品久久久久久琪琪| 亚洲永久在线观看| 欧美三级欧美成人高清www| 中文国产亚洲喷潮| 亚洲18私人小影院| 欧美性xxxx极品高清hd直播| 亚洲人永久免费| 国产中文字幕日韩| 亚洲最大福利网| 久久99久久亚洲国产| 国产成人欧美在线观看| 欧美一区第一页| 97精品国产97久久久久久| 国产经典一区二区| 性欧美激情精品| 欧日韩在线观看| 中文字幕一区二区三区电影| 91久久在线视频| 欧美xxxx14xxxxx性爽| 黑人与娇小精品av专区| 亚洲激情视频在线| 97视频人免费观看| 欧美一区三区三区高中清蜜桃| 一区二区亚洲精品国产| 亚洲已满18点击进入在线看片| 国产欧美va欧美va香蕉在| 亚洲精品久久久久| 欧美一级电影久久| 国产精品无av码在线观看| 精品国产成人在线| 国产精品国模在线| 欧美综合在线观看| 欧美激情18p| 日韩高清电影免费观看完整| 亚洲色图国产精品| 日韩电影在线观看中文字幕| 亚洲欧美激情一区| 亚洲专区中文字幕| 国产mv免费观看入口亚洲| 亚洲精品日韩丝袜精品| 亚洲欧洲在线观看| 亚洲高清一区二| 欧美日韩aaaa| 亚洲国产精品专区久久| 在线成人免费网站| 亚洲天堂网站在线观看视频| 欧美一级片免费在线| 日韩av成人在线| 亚洲人a成www在线影院| 欧美激情第三页| 国产精品久久久久久搜索| 国产午夜精品一区二区三区| 91欧美精品午夜性色福利在线| 国产性色av一区二区| 欧美激情网友自拍| 亚洲欧美日韩国产中文| 国产精品色悠悠| 欧美黄色片在线观看| 日韩电影中文 亚洲精品乱码| 亚洲成年人在线| 国产原创欧美精品| 韩剧1988在线观看免费完整版| 欧美野外wwwxxx| 亚洲性视频网站| 亚洲一区av在线播放| 国产mv免费观看入口亚洲| 最近免费中文字幕视频2019|