• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      利用觀察者模式實(shí)現(xiàn)自頂向下消息傳遞

      2011-01-26 06:42:18肖永剛
      文山學(xué)院學(xué)報(bào) 2011年6期
      關(guān)鍵詞:發(fā)布者觀察者消息

      肖永剛

      (文山學(xué)院計(jì)科系,云南文山663000)

      校園中存在著許多的對(duì)象,例如校園、教師、學(xué)生等,這些對(duì)象代表著真實(shí)校園中的各種實(shí)體。在真實(shí)的校園中消息是這樣傳遞的,首先校園有了一個(gè)消息,它需要將這個(gè)消息通知教師,再由教師將這個(gè)消息通知學(xué)生?;蛘撸處熡辛艘粋€(gè)消息,他需要將這個(gè)消息通知學(xué)生,但不必將這個(gè)消息通知校園。消息總是從較高的層次向較低的層次傳遞,不會(huì)反向的從較低的層次向較高的層次傳遞。這是一種自頂向下式的消息傳遞機(jī)制。

      同樣的,在設(shè)計(jì)虛擬校園[1]時(shí),也要實(shí)現(xiàn)這樣的一種消息傳遞方式。校園、教師和學(xué)生等對(duì)象構(gòu)成了整個(gè)虛擬校園的基本元素。文章只介紹了這三者之間的消息傳遞機(jī)制,以簡(jiǎn)化需要討論的問(wèn)題。

      觀察者模式[2]在對(duì)象之間定義了一種一對(duì)多的依賴關(guān)系。當(dāng)一個(gè)對(duì)象(發(fā)布者)的狀態(tài)發(fā)生變化時(shí),其它的對(duì)象(觀察者),會(huì)馬上感知或接受到這種變化,所以觀察者模式在開發(fā)虛擬校園時(shí)非常有用。對(duì)比兩種設(shè)計(jì)虛擬校園的方法,一種沒(méi)有使用觀察者模式,而只是基于組合原則來(lái)構(gòu)建系統(tǒng),另一種應(yīng)用了觀察者模式來(lái)設(shè)計(jì)開發(fā)虛擬校園,在校園、教師和學(xué)生三個(gè)對(duì)象之間建立起一對(duì)多的依賴關(guān)系。文章用對(duì)比的方式來(lái)說(shuō)明應(yīng)用觀察者模式設(shè)計(jì)帶來(lái)的好處[3]。

      1 初始的設(shè)計(jì)

      類圖如圖1所示,校園、教師和學(xué)生通過(guò)組合的方式聯(lián)系在一起,組合原則廣泛地應(yīng)用于這個(gè)設(shè)計(jì)中。Campus類包含一個(gè)實(shí)體變量teachers,用來(lái)代表教師對(duì)象,即消息要傳遞給誰(shuí)。Teacher類包含一個(gè)實(shí)體變量students,代表學(xué)生對(duì)象,即要繼續(xù)將消息傳遞給誰(shuí)。三個(gè)類之間通過(guò)變量teachers和變量students進(jìn)行訪問(wèn)。

      圖1 應(yīng)用組合方式構(gòu)建的系統(tǒng)

      序列圖[4]如圖2所示,系統(tǒng)生成參與消息傳遞的對(duì)象,分別屬于 Campus、Teacher和 Student類。在對(duì)象內(nèi)部已經(jīng)指定了消息的發(fā)送者和接受者,在系統(tǒng)運(yùn)行的過(guò)程中不會(huì)也不能更改它們。首先Campus類產(chǎn)生一個(gè)消息并將它傳遞給Teacher類,通過(guò)調(diào)用Campus類的broadcast方法實(shí)現(xiàn)。然后Teacher類接受這個(gè)消息并將它傳遞給Student類,通過(guò)調(diào)用Teacher類的 receiveMessage和 broadcast方法實(shí)現(xiàn)。最后Student類接受這個(gè)消息,通過(guò)調(diào)用Student類的receiveMessage方法實(shí)現(xiàn)。這樣的方式可以實(shí)現(xiàn)消息的自頂向下的傳遞,滿足系統(tǒng)設(shè)計(jì)的要求。

      圖2 應(yīng)用組合方式時(shí)的序列圖

      但是這種設(shè)計(jì)方式有它的不足之處。一方面,當(dāng)要擴(kuò)展虛擬校園的功能時(shí),比方說(shuō)增加一些對(duì)象,這些對(duì)象同樣要參與到消息傳遞的過(guò)程當(dāng)中,此時(shí)就需要對(duì)已有類的定義代碼進(jìn)行修改,定義更多的實(shí)體變量來(lái)代表新加入的對(duì)象。當(dāng)加入到系統(tǒng)中的對(duì)象越來(lái)越多時(shí),這種修改的工作量將變得很大。產(chǎn)生錯(cuò)誤的幾率也隨之增加,系統(tǒng)的可維護(hù)性變得很差。另一方面,這個(gè)設(shè)計(jì)中沒(méi)有提供一種靈活的更改消息發(fā)送或接受對(duì)象的方法。在系統(tǒng)運(yùn)行時(shí),不能動(dòng)態(tài)的將對(duì)象加入到消息傳遞過(guò)程中,或從消息傳遞過(guò)程中將對(duì)象移除,因?yàn)檫@些都是在類的定義中預(yù)先指定了的。通過(guò)這種方式設(shè)計(jì)的系統(tǒng)缺少靈活性。

      2 改進(jìn)的設(shè)計(jì)

      應(yīng)用觀察者模式重新設(shè)計(jì)了虛擬校園,系統(tǒng)在可擴(kuò)展性和靈活性上都獲得很大的提高,類圖如圖3所示,Campus類是發(fā)布者;Teacher類有兩個(gè)身份,既可以是發(fā)布者又可以是觀察者,Student類只能作為觀察者。當(dāng)Campus類或者Teacher類發(fā)送消息時(shí),它們相應(yīng)的觀察者將會(huì)收到消息。采用這樣的設(shè)計(jì)方式,整個(gè)系統(tǒng)的靈活性得到了提高。只要一個(gè)對(duì)象實(shí)現(xiàn)了發(fā)布者接口,它就可以是發(fā)布者,不管這個(gè)對(duì)象實(shí)際上是做什么的[5]。同樣,只要一個(gè)對(duì)象實(shí)現(xiàn)了觀察者接口,它就可以是觀察者。所以,當(dāng)要擴(kuò)展系統(tǒng)功能時(shí),可以很方便地添加一些實(shí)現(xiàn)了這兩種接口的類,而不需要對(duì)已有的類進(jìn)行修改。唯一需要保證的是,這些類實(shí)現(xiàn)了相應(yīng)的接口。

      圖3 應(yīng)用觀察者模式構(gòu)建的系統(tǒng)

      虛擬校園系統(tǒng)在校園、教師和學(xué)生之間建立了兩個(gè)一對(duì)多的依賴關(guān)系。一個(gè)是Campus類與Teacher類,Teacher類依賴Campus類傳遞消息;另一個(gè)是Teacher類與 Student類,Student類依賴 Teacher類傳遞消息。Teacher類扮演了兩種身份,既是消息的接受方又是消息的發(fā)送方。

      在Subject接口中,方法attach用來(lái)注冊(cè)觀察者,detach用來(lái)注銷觀察者,方法notify用來(lái)通知觀察者;在Observer接口中,方法receiveMessage用來(lái)接受消息。在Campus類中,變量observers用來(lái)代表消息的觀察者列表,方法getMessage用來(lái)產(chǎn)生新的消息;在Teacher類中,變量observers用來(lái)代表消息的觀察者列表,變量campus用來(lái)代表消息的發(fā)布者,方法getMessage用來(lái)產(chǎn)生新的消息;在Student類中,變量campus用來(lái)代表消息的發(fā)布者,方法get-Message用來(lái)產(chǎn)生新的消息。

      序列圖如圖4所示,當(dāng)Campus類傳遞消息之前,它需要調(diào)用attach和detach方法決定消息由誰(shuí)接受。一旦產(chǎn)生一條消息,它首先將這條消息傳遞給Teacher類,Teacher類收到消息后,也需要調(diào)用attach和detach方法決定消息由誰(shuí)接受,再將這條消息傳遞給Student類。這樣,通過(guò)動(dòng)態(tài)的注冊(cè)和注銷觀察者,以及利用不同對(duì)象之間方法的依次調(diào)用,實(shí)現(xiàn)了消息自頂向下的傳遞。

      圖4 應(yīng)用觀察者模式時(shí)的序列圖

      3 結(jié)論

      總體來(lái)看,應(yīng)用設(shè)計(jì)者模式的優(yōu)點(diǎn)大于缺點(diǎn)。首先,系統(tǒng)獲得良好的可擴(kuò)展性,可以很容易的向系統(tǒng)中添加新的對(duì)象,需要做的只是要那些新加入的對(duì)象實(shí)現(xiàn)Subject接口或Observer接口,然后,可以在需要它們進(jìn)行消息傳遞的時(shí)候注冊(cè)到觀察者列表,在不需要進(jìn)行消息傳遞的時(shí)候注銷出觀察者列表。其次,對(duì)于本系統(tǒng)中參與消息傳遞的對(duì)象,因?yàn)榘l(fā)布者和觀察者之間并不存在很緊密的聯(lián)系,它們可以獨(dú)立地應(yīng)用在其它的系統(tǒng)中。對(duì)其中某個(gè)對(duì)象的復(fù)用不受到另外對(duì)象的影響或限制。最后,如果對(duì)某個(gè)對(duì)象進(jìn)行了修改,不會(huì)影響其它的對(duì)象,不需要修改已有的對(duì)象。所以,采用了觀察者模式重新設(shè)計(jì)以后,系統(tǒng)獲得了良好的可擴(kuò)展性和靈活性,有利于系統(tǒng)的修改和維護(hù)。

      可以看到,重新設(shè)計(jì)以后將會(huì)帶來(lái)更多的接口和方法。每個(gè)發(fā)布者或接受者都需要某個(gè)接口去定義。但是對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō),這可能會(huì)帶來(lái)管理上的困難,因?yàn)楦櫥蚓S護(hù)這些類的工作量會(huì)增多。

      [1] 劉巧紅.計(jì)算機(jī)虛擬校園的建造與人機(jī)交互的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,(19):4332 -4335.

      [2] Eric Freeman,Elisabeth Freeman,Kathy Sierra & Bert Bates.Head First Design Patterns[M].USA:O’reilly Media,2004:51.

      [3] 廖志堅(jiān),蔣明亮.設(shè)計(jì)模式在廣東高新區(qū)產(chǎn)業(yè)地圖研究系統(tǒng)中的應(yīng)用[J].科技管理研究,2011,(2):123-126.

      [4] Dan Pilone& Russ Miles.Head First Software Development[M].USA:O’reilly Media,2007:436-437.

      [5] Kathy Sierra& Bert Bates.Head First Java[M].USA:O’reilly Media,2007:226.

      猜你喜歡
      發(fā)布者觀察者消息
      觀察者
      一張圖看5G消息
      冷靜而又理性的觀察者——德國(guó)華人作家劉瑛訪談
      基于NDN的高效發(fā)布/訂閱系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
      廣告發(fā)布者的著作權(quán)審查義務(wù)問(wèn)題研究
      加權(quán)映射匹配方法的站內(nèi)搜索引擎設(shè)計(jì)
      消息
      消息
      消息
      觀察者模式在Java 事件處理中的應(yīng)用研究*
      兰考县| 福安市| 武功县| 绥阳县| 东乌| 蒙城县| 平邑县| 稷山县| 阜康市| 吴忠市| 谢通门县| 海伦市| 平武县| 鄢陵县| 芦溪县| 浪卡子县| 和政县| 呼玛县| 永兴县| 扶沟县| 托克托县| 曲松县| 八宿县| 襄城县| 南宁市| 都安| 高阳县| 云浮市| 乌拉特后旗| 古蔺县| 霍林郭勒市| 开江县| 砀山县| 长丰县| 莒南县| 福清市| 广河县| 肥城市| 渝北区| 汨罗市| 宁城县|