說(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();
結果如圖