做過(guò)DOS編程的人都知道,Dos編程和Window編程最大不同之一就是事件機(jī)制的編程,普遍的,目前事件機(jī)制的使用已經(jīng)在Windows下的應(yīng)用程序中遍地開(kāi)花了,可是基于事件傳播的應(yīng)用僅僅限于window應(yīng)用程序嗎?答案是:不。 在IOC概念的不斷沖擊下,我們需要回頭去審視前兩年自己開(kāi)發(fā)的,心中為之驕傲的,認(rèn)為非常優(yōu)秀的程序,在這過(guò)程中,我們就會(huì)看到這些驕傲在最新的概念沖擊下煙消云散了。變成了丑陋的,緊耦合的反面范例。讓我們來(lái)看看以下場(chǎng)景:
某公司有基于某平臺(tái)的兩子系統(tǒng),訂購(gòu)系統(tǒng)A和財(cái)務(wù)系統(tǒng)B。當(dāng)采購(gòu)員在預(yù)采購(gòu)某物品前,先在定購(gòu)系統(tǒng)A中登記需要購(gòu)買(mǎi)的貨物和價(jià)格,然后財(cái)務(wù)系統(tǒng)B就開(kāi)始該筆購(gòu)物款項(xiàng)的申請(qǐng)流程。 首先讓我們來(lái)看看兩年前的代碼是怎么實(shí)現(xiàn)的:
從上面的代碼中可以很明顯看到,定購(gòu)系統(tǒng)A和財(cái)務(wù)子系統(tǒng)發(fā)生了耦合,也許有同志說(shuō),那我采用Spring等IOC框架來(lái)解耦:
財(cái)務(wù)子系統(tǒng)B的實(shí)現(xiàn)FinancialServiceImpl是通過(guò)Spring等IOC框架設(shè)置進(jìn)去的。這樣不是很完美了嗎?
但是我仍然要說(shuō),這個(gè)只是五十步笑百步罷了。再請(qǐng)看以下場(chǎng)景:該公司的業(yè)務(wù)規(guī)則起了變化,金額少于1萬(wàn)元的定購(gòu)不需要通過(guò)財(cái)務(wù)申請(qǐng)流程。這樣財(cái)務(wù)子系統(tǒng)B升級(jí)到B2了,多了一個(gè)直接撥款的API payMoney()。這時(shí)候,定購(gòu)系統(tǒng)該怎么辦?除了修改代碼沒(méi)有別的辦法。這個(gè)時(shí)候,基于事件分發(fā)處理的機(jī)制就大派用場(chǎng)了。 修改原來(lái)的訂單系統(tǒng)實(shí)現(xiàn)下單消息的廣播。
實(shí)現(xiàn)一個(gè)消息監(jiān)聽(tīng)器:
在配置中設(shè)置(這里我們使用的是Spring) <bean id="orderService" ...> <property name="eventListener"> <list> <ref local="orderListener"/> </list> </property> </bean> <bean id="orderListener" ...>
這樣我們就實(shí)現(xiàn)了訂單系統(tǒng)和財(cái)務(wù)系統(tǒng)的解耦,如果財(cái)務(wù)系統(tǒng)發(fā)生的修改,我們就只需實(shí)現(xiàn)新的監(jiān)聽(tīng)器就可以了:
下一篇文章,我將引入AOP的概念來(lái)將系統(tǒng)提高到更高的抽象層次。 (全文完)
posted on 2005-12-05 20:31 wolfsquare 閱讀(2307) 評(píng)論(4) 編輯 收藏 所屬分類: 企業(yè)應(yīng)用
Powered by: BlogJava Copyright © wolfsquare