摘 要:本文主要介紹觀察者模式的基本概念,應用模型,以及在.NET中的實現(xiàn)。并且闡述基于觀察者模式的事件委托的實現(xiàn)。
關鍵詞:觀察者模式;事件委托;.NET
中圖分類號:TP311.10
軟件設計模式是體現(xiàn)編程思想,優(yōu)化程序效率的有效方法。使用設計模式可以提高代碼重用性,保證代碼可靠性。工廠模式,代理模式,原型模式等軟件設計模式在實際編程中都有廣泛的應用。本文將以觀察者模式為例,說明其在程序設計中的實現(xiàn)以及在事件委托中的應用。
1 觀察者模式
首先,介紹一下觀察者模式的定義。觀察者模式又稱發(fā)布-訂閱模式,定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某個主題對象。當這個主題對象狀態(tài)發(fā)生改變時,會通知所有觀察者對象,使其能夠自動更新自己的狀態(tài)。
下面我們更為具體的解釋一下觀察者模式。在一個公司里面,老板經(jīng)常外出,又經(jīng)?!翱战怠被貋?,檢查員工的工作狀態(tài)。那么,很多員工為了既可以在老板不在的時候上網(wǎng)休閑,又不會讓老板回來時發(fā)現(xiàn)自己在偷懶,就聯(lián)系公司的前臺秘書,在老板回來的時候通過撥打辦公室的電話來通知大家老板回來了。在這個例子里面,我們很容易理解,員工就是觀察者對象,而老板和前臺秘書就是主題對象。
圖1
如圖1所示,Subject類就是抽象主題,它負責把所有觀察者對象的引用保存在一個集合里面,每個主題可以有任意數(shù)量的觀察者,抽象主題提供一個接口可以增加,刪除和通知觀察者對象。Concrete Subject類,是具體的主題,負責將有關狀態(tài)存入具體觀察者對象,在具體主體對象內(nèi)部狀態(tài)改變時,給所有注冊的觀察者對象發(fā)通知。在我們的例子中,老板和秘書都屬于具體的主體對象。Observer類,是抽象觀察者,負責給具體觀察者定義接口,在得到主題的通知時更新自己。Concrete Observer類就是具體的觀察者,實現(xiàn)抽象觀察者的更新接口。辦公室里的員工就是具體的觀察者。下面就是.NET實現(xiàn)觀察者模式的例子。
在介紹事件委托之前,我們先來總結一下觀察者模式的優(yōu)點以及不足。觀察者模式應用在當一個對象的改變需要同時影響其它對象的改變的時候,為了維持程序一致性,而又不增加耦合性,通過讓耦合雙方都依賴于抽象而非具體,使得各自變化都不會影響另一邊的變化,這也是依賴倒轉原則的體現(xiàn)。而之所以用接口而非抽象類來定義,是因為在實際的應用中,觀察者們可能是毫不相關的類,但它們都根據(jù)主體對象的通知更新自己的狀態(tài),所以只抽象出方法給抽象觀察者類。而觀察者模式也存在不足的地方。
2 事件委托
觀察者模式的不足之處體現(xiàn)在,一定要有一個公共接口Object類,并且每個具體的觀察者對象都要是實現(xiàn)這個類,而Subject類要依賴與Object類,從前面的例子可以看出,Subject類需要依賴于Object中的Update()方法,就是說如果沒有Object類,就沒有辦法實現(xiàn)通知的功能。以VS 2005為例,當運行程序點擊運行按鈕的時候,軟件也頁面會發(fā)生多處變化,其中包括工具欄,控制臺窗體顯示,工具箱消失等。而這些變化涉及到了多個組件由同一事件觸發(fā),符合應用觀察者模式。但是這些組件早就被制造商封裝了,沒有辦法讓每個控件都去實現(xiàn)一個Object接口。那么如何來解決這個問題,就要應用到事件委托。
事件委托就是一種可以不依賴于抽象觀察者對象,由客戶端決定通知哪些觀察者的機制。事件委托的一個關鍵就是聲明一個委托對象,可以有系統(tǒng)自定義的,如EventHandler,也可以是用戶自定義的。
delegate void EventHandler();
public event EventHandler Update;
聲明一個委托對象需要用delegate關鍵字,而聲明一個事件對象要用event關鍵字。由此我們看出,委托就是一種引用方法類型,當我們?yōu)槲匈x值方法的時候,委托就將獲得該方法的全部行為,委托方法的使用與其它方法相同,具有返回值和參數(shù)。我們可以將委托看成是一種對函數(shù)這個“對象”的“類”,而委托的實現(xiàn)就是一個具體的函數(shù)“對象”。委托所賦值的方法可以屬于不同類并且所有賦值的方法都會被依次喚醒,值得注意的是,所賦值的方法必須具有相同的參數(shù)列表和返回值類型。而事件是指在發(fā)生其他類或對象關注的事件時,類或對象可以通過時間通知它們。這樣我們不再需要Observer類,可以直接在客戶端調(diào)用secretary.Update()+=new EventHandler(ConcreteObject cObject.methodA)來實現(xiàn)監(jiān)聽。
觀察者模式及其應用事件委托在軟件開發(fā)過程中是不可或缺的一部分,事件監(jiān)聽在面向對象語言中有著重要的作用,不僅在.NET中有委托事件,在JAVA中也有GUI的事件監(jiān)聽,深刻理解觀察者模式是面向對象編程的一種基本思想。
參考文獻:
[1]程杰.大話設計模式[M].北京:清華大學出版社,2007.
[2]MSDN.Microsoft開發(fā)人員網(wǎng)絡[OL].http://msdn.microsoft.com/zh-cn/default.aspx.
[3]Freeman,E.Head First設計模式(中文版)[M].北京:中國電力出版社,2007.
作者簡介:王貫飛(1966.4-),女,副教授,本科,主要從事計算機多媒體、Flash動畫、編程、多媒體課件制作。
作者單位:遼寧輕工職業(yè)學院,遼寧大連 116100