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