• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于觀察者模式的事件委托在.NET中的實(shí)現(xiàn)與應(yīng)用

    2014-04-29 00:00:00王貫飛

    摘 要:本文主要介紹觀察者模式的基本概念,應(yīng)用模型,以及在.NET中的實(shí)現(xiàn)。并且闡述基于觀察者模式的事件委托的實(shí)現(xiàn)。

    關(guān)鍵詞:觀察者模式;事件委托;.NET

    中圖分類號:TP311.10

    軟件設(shè)計(jì)模式是體現(xiàn)編程思想,優(yōu)化程序效率的有效方法。使用設(shè)計(jì)模式可以提高代碼重用性,保證代碼可靠性。工廠模式,代理模式,原型模式等軟件設(shè)計(jì)模式在實(shí)際編程中都有廣泛的應(yīng)用。本文將以觀察者模式為例,說明其在程序設(shè)計(jì)中的實(shí)現(xiàn)以及在事件委托中的應(yīng)用。

    1 觀察者模式

    首先,介紹一下觀察者模式的定義。觀察者模式又稱發(fā)布-訂閱模式,定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時(shí)監(jiān)聽某個主題對象。當(dāng)這個主題對象狀態(tài)發(fā)生改變時(shí),會通知所有觀察者對象,使其能夠自動更新自己的狀態(tài)。

    下面我們更為具體的解釋一下觀察者模式。在一個公司里面,老板經(jīng)常外出,又經(jīng)常“空降”回來,檢查員工的工作狀態(tài)。那么,很多員工為了既可以在老板不在的時(shí)候上網(wǎng)休閑,又不會讓老板回來時(shí)發(fā)現(xiàn)自己在偷懶,就聯(lián)系公司的前臺秘書,在老板回來的時(shí)候通過撥打辦公室的電話來通知大家老板回來了。在這個例子里面,我們很容易理解,員工就是觀察者對象,而老板和前臺秘書就是主題對象。

    圖1

    如圖1所示,Subject類就是抽象主題,它負(fù)責(zé)把所有觀察者對象的引用保存在一個集合里面,每個主題可以有任意數(shù)量的觀察者,抽象主題提供一個接口可以增加,刪除和通知觀察者對象。Concrete Subject類,是具體的主題,負(fù)責(zé)將有關(guān)狀態(tài)存入具體觀察者對象,在具體主體對象內(nèi)部狀態(tài)改變時(shí),給所有注冊的觀察者對象發(fā)通知。在我們的例子中,老板和秘書都屬于具體的主體對象。Observer類,是抽象觀察者,負(fù)責(zé)給具體觀察者定義接口,在得到主題的通知時(shí)更新自己。Concrete Observer類就是具體的觀察者,實(shí)現(xiàn)抽象觀察者的更新接口。辦公室里的員工就是具體的觀察者。下面就是.NET實(shí)現(xiàn)觀察者模式的例子。

    在介紹事件委托之前,我們先來總結(jié)一下觀察者模式的優(yōu)點(diǎn)以及不足。觀察者模式應(yīng)用在當(dāng)一個對象的改變需要同時(shí)影響其它對象的改變的時(shí)候,為了維持程序一致性,而又不增加耦合性,通過讓耦合雙方都依賴于抽象而非具體,使得各自變化都不會影響另一邊的變化,這也是依賴倒轉(zhuǎn)原則的體現(xiàn)。而之所以用接口而非抽象類來定義,是因?yàn)樵趯?shí)際的應(yīng)用中,觀察者們可能是毫不相關(guān)的類,但它們都根據(jù)主體對象的通知更新自己的狀態(tài),所以只抽象出方法給抽象觀察者類。而觀察者模式也存在不足的地方。

    2 事件委托

    觀察者模式的不足之處體現(xiàn)在,一定要有一個公共接口Object類,并且每個具體的觀察者對象都要是實(shí)現(xiàn)這個類,而Subject類要依賴與Object類,從前面的例子可以看出,Subject類需要依賴于Object中的Update()方法,就是說如果沒有Object類,就沒有辦法實(shí)現(xiàn)通知的功能。以VS 2005為例,當(dāng)運(yùn)行程序點(diǎn)擊運(yùn)行按鈕的時(shí)候,軟件也頁面會發(fā)生多處變化,其中包括工具欄,控制臺窗體顯示,工具箱消失等。而這些變化涉及到了多個組件由同一事件觸發(fā),符合應(yīng)用觀察者模式。但是這些組件早就被制造商封裝了,沒有辦法讓每個控件都去實(shí)現(xiàn)一個Object接口。那么如何來解決這個問題,就要應(yīng)用到事件委托。

    事件委托就是一種可以不依賴于抽象觀察者對象,由客戶端決定通知哪些觀察者的機(jī)制。事件委托的一個關(guān)鍵就是聲明一個委托對象,可以有系統(tǒng)自定義的,如EventHandler,也可以是用戶自定義的。

    delegate void EventHandler();

    public event EventHandler Update;

    聲明一個委托對象需要用delegate關(guān)鍵字,而聲明一個事件對象要用event關(guān)鍵字。由此我們看出,委托就是一種引用方法類型,當(dāng)我們?yōu)槲匈x值方法的時(shí)候,委托就將獲得該方法的全部行為,委托方法的使用與其它方法相同,具有返回值和參數(shù)。我們可以將委托看成是一種對函數(shù)這個“對象”的“類”,而委托的實(shí)現(xiàn)就是一個具體的函數(shù)“對象”。委托所賦值的方法可以屬于不同類并且所有賦值的方法都會被依次喚醒,值得注意的是,所賦值的方法必須具有相同的參數(shù)列表和返回值類型。而事件是指在發(fā)生其他類或?qū)ο箨P(guān)注的事件時(shí),類或?qū)ο罂梢酝ㄟ^時(shí)間通知它們。這樣我們不再需要Observer類,可以直接在客戶端調(diào)用secretary.Update()+=new EventHandler(ConcreteObject cObject.methodA)來實(shí)現(xiàn)監(jiān)聽。

    觀察者模式及其應(yīng)用事件委托在軟件開發(fā)過程中是不可或缺的一部分,事件監(jiān)聽在面向?qū)ο笳Z言中有著重要的作用,不僅在.NET中有委托事件,在JAVA中也有GUI的事件監(jiān)聽,深刻理解觀察者模式是面向?qū)ο缶幊痰囊环N基本思想。

    參考文獻(xiàn):

    [1]程杰.大話設(shè)計(jì)模式[M].北京:清華大學(xué)出版社,2007.

    [2]MSDN.Microsoft開發(fā)人員網(wǎng)絡(luò)[OL].http://msdn.microsoft.com/zh-cn/default.aspx.

    [3]Freeman,E.Head First設(shè)計(jì)模式(中文版)[M].北京:中國電力出版社,2007.

    作者簡介:王貫飛(1966.4-),女,副教授,本科,主要從事計(jì)算機(jī)多媒體、Flash動畫、編程、多媒體課件制作。

    作者單位:遼寧輕工職業(yè)學(xué)院,遼寧大連 116100

    林芝县| 沛县| 巴塘县| 大新县| 丹江口市| 贵港市| 金坛市| 杨浦区| 西和县| 五原县| 和静县| 马龙县| 遵义市| 长海县| 鄂伦春自治旗| 衡阳市| 宽甸| 马公市| 绿春县| 蒲城县| 罗江县| 嘉定区| 宁陕县| 绩溪县| 大丰市| 江山市| 金塔县| 尚义县| 景泰县| 洛南县| 海淀区| 陇西县| 法库县| 雷山县| 柳江县| 武功县| 朝阳市| 龙泉市| 剑川县| 微山县| 吴川市|