溫立輝
摘 要:針對(duì)交通信號(hào)系統(tǒng)中信號(hào)燈與控制中心的耦合問題,討論了觀察者模式的思想原理以及類組成結(jié)構(gòu),闡述觀察者模式的適用場(chǎng)景;同時(shí)分析了觀察者模式如何應(yīng)用在交通信號(hào)系統(tǒng)中,進(jìn)一步提升信號(hào)燈的合理性與靈活性。
關(guān)鍵詞:觀察者;訂閱;發(fā)布;主題;通知
觀察者模式(Publish/Subscribe)是一種行為模式,適用于多對(duì)象信息系統(tǒng)的交互場(chǎng)景中,其能有效的降低主題與對(duì)象間的依賴關(guān)系,解耦模塊間的耦合程度,進(jìn)一步提升編程語言的抽象能力。
1 認(rèn)識(shí)觀察者模式
觀察者模式作為一種解耦模式,是行為模式中的典范,其核心要素是主題類,也稱為模式中心,其一舉一動(dòng)都會(huì)影響相關(guān)的追隨者—訂閱類,其行為體現(xiàn)了一種廣播式的傳遞效應(yīng)。
在圖1中可以看到,該模式由四部分組成,分別是:主題、訂閱者以及兩個(gè)抽象基類的實(shí)現(xiàn)子類,每個(gè)部分具體功能結(jié)構(gòu)描述如下。
1.1 抽象主題(Subject)
各具體主題類的繼承類,定義了注冊(cè)監(jiān)聽主題的方法(register),還存在發(fā)布主題更改的方法(publishNotice),具體的主題類實(shí)現(xiàn)由子類定義。
1.2 具體主題(ConcreteSubject)
抽象主題類的一個(gè)實(shí)現(xiàn)子類,負(fù)責(zé)定義具體的主題,需實(shí)現(xiàn)父類主題的定義方法(setNotice)。
1.3 抽象觀察者(Observer)
抽象觀察者父類是所有觀察者對(duì)外交互的門面,本類中需定義一個(gè)抽象的接收通知方法(receiveNotice),在抽象主題類中需引入該類型,作為對(duì)觀察者的操作引用。
1.4 具體觀察者(ConcreteObserver)
抽象觀察者的一個(gè)實(shí)現(xiàn)子類,在主題狀態(tài)發(fā)生變化時(shí),負(fù)責(zé)接收消息更改具體觀察者自身的狀態(tài),需實(shí)現(xiàn)父類中receiveNotice方法。
2 在信號(hào)系統(tǒng)中應(yīng)用
觀察者模式最典型的應(yīng)用就是交通信號(hào)系統(tǒng)中,在該系統(tǒng)中有信號(hào)控制中心與為數(shù)眾多的信號(hào)燈。當(dāng)信號(hào)控制中心發(fā)出對(duì)應(yīng)的信號(hào)變換指令時(shí),所有信號(hào)指示燈都需變更自身信號(hào)指示,也就是當(dāng)信息控制中心這一主題發(fā)生變化時(shí),所有的觀察者對(duì)象(信號(hào)燈)都要更改自身的狀態(tài),如圖2所示。
完成以上4步,就基本上實(shí)現(xiàn)了信號(hào)系統(tǒng)的主體結(jié)構(gòu),其余只完成相應(yīng)的細(xì)節(jié),加上如界面組件及監(jiān)聽控制等方面即可。
3 結(jié)語
將一個(gè)系統(tǒng)分割成眾多的協(xié)作類增加了程序的靈活度,但同時(shí)也帶來負(fù)面影響,那就是需要維護(hù)分割出來后對(duì)象之間的一致性。在交通信號(hào)系統(tǒng)中,恰如其分的使用了訂閱/發(fā)布這一行為模式而有效降低了指揮中心與信號(hào)燈的耦合,極大的提高了系統(tǒng)的靈活性與裝配能力。
參考文獻(xiàn):
[1] 劉凌云.觀察者模式在面向抽象編程中的應(yīng)用[J].計(jì)算機(jī)與數(shù)字工程,2016,44(8):1474-1477,1522.
[2] 歐陽宏基,楊衛(wèi)忠,趙薔.觀察者模式在Java事件處理中的應(yīng)用研究[J].微處理機(jī),2013,34(4):77-79.
[3] 吳清壽.基于事件機(jī)制的觀察者模式及應(yīng)用[J].重慶理工大學(xué)學(xué)報(bào):自然科學(xué)版,2012,26(9):100-104.