国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

設計模式-觀察者模式

2019-11-14 15:51:43
字體:
來源:轉載
供稿:網(wǎng)友

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

下面開始編碼:

第一步:我們先看被觀察者(就是主題),被觀察者有什么特性呢,首先有觀察者就是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();    }

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

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

第三步:實現(xiàn)被觀察者

/// <summary>    /// 實現(xiàn)主題    /// </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);            }        }

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

第四步:實現(xiàn)觀察者

/// <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個不同的觀察者,因為他們來自不同的國家(項目中可以根據(jù)實際情況)

第五步:運行看下結果

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

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

A:主題

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

 B:得到信息后的操作

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

C:觸發(fā)事件

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>    /// 委托/事件實現(xiàn)主題    /// </summary>    public class SubjectEventHandler    {        public Action<string> SendAction;         /// <summary>        /// 公布信息        /// </summary>        public string PublishInfo { get; set; }        /// <summary>        /// 發(fā)送信息        /// </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();

同樣實現(xiàn)了2中的效果

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 保山市| 静海县| 临桂县| 威海市| 姚安县| 易门县| 普格县| 明星| 白城市| 大英县| 海门市| 灵宝市| 武宣县| 彰化市| 偏关县| 苍南县| 山阴县| 读书| 泰和县| 高清| 恩平市| 如东县| 平远县| 拉孜县| 准格尔旗| 正阳县| 花莲县| 繁峙县| 屯留县| 昌江| 大同市| 舒兰市| 嫩江县| 福清市| 象山县| 岑溪市| 溧阳市| 璧山县| 乳源| 昌吉市| 浑源县|