<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 11, 文章 - 1, 評(píng)論 - 20, 引用 - 0
    數(shù)據(jù)加載中……

    基于事件分發(fā)機(jī)制的企業(yè)應(yīng)用開(kāi)發(fā)

        做過(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)的:

     

    public class OrderService {
       
    private FinancialService  financialService=new FinancialServiceImpl();
         
    public Order saveOrder(Order order){
      。。。。處理訂單
                    financialService.createRequestOfMoney(order.getAmount());
       }

     }


    從上面的代碼中可以很明顯看到,定購(gòu)系統(tǒng)A和財(cái)務(wù)子系統(tǒng)發(fā)生了耦合,也許有同志說(shuō),那我采用Spring等IOC框架來(lái)解耦:
     

    public class OrderService {
       
    private FinancialService  financialService;
       
    public void setFinancialService(FinancialService fs){
         
    this.financialService=fs;
       }

         
    public Order saveOrder(Order order){
      。。。。處理訂單
                    financialService.createRequestOfMoney(order.getAmount());
       }

     }


    財(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)下單消息的廣播。
     

    public class OrderService extend EventBrocast{
       
    private FinancialService  financialService=new FinancialServiceImpl();
         
    public Order saveOrder(Order order){
      。。。。處理訂單
                    brocastEvent(
    new Event(order)); // ***
       }

     }

     

     實(shí)現(xiàn)一個(gè)消息監(jiān)聽(tīng)器:

    public OrderEventListener implements EventListener{
      
    public void performed(Event e){
       Order order 
    =(Order) e.getObject();
        financialService.createRequestOfMoney(order.getAmount());
      }

     }

     

     在配置中設(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)器就可以了:

     

    public  NewOrderEventListener implements EventListener{
        
    private FinancialService  financialService;
        
    public void setFinancialService(FinancialService fs){
         
    this.financialService=fs;
       }


      
    public void performed(Event e){
       Order order 
    =(Order) e.getObject();
        financialService.payMoney(order.getAmount());
      }

     }

     

     下一篇文章,我將引入AOP的概念來(lái)將系統(tǒng)提高到更高的抽象層次。
     (全文完)

    posted on 2005-12-05 20:31 wolfsquare 閱讀(2307) 評(píng)論(4)  編輯  收藏 所屬分類: 企業(yè)應(yīng)用

    評(píng)論

    # re: 基于事件分發(fā)機(jī)制的企業(yè)應(yīng)用開(kāi)發(fā)   回復(fù)  更多評(píng)論   

    我說(shuō)一下我的一小點(diǎn)看法

    對(duì)于你的代碼
    public class OrderService {
    private FinancialService financialService;
    public void setFinancialService(FinancialService fs){
    this.financialService=fs;
    }
    public Order saveOrder(Order order){
    。。。。處理訂單
    // financialService.createRequestOfMoney(order.getAmount());
    financialService.dealWith(order.getAmount());
    }
    }

    我覺(jué)得當(dāng)遇到你說(shuō)的情況時(shí),我同樣可以Create another impl class來(lái)完成這個(gè)任務(wù)阿
    當(dāng)然FinancialService 的接口最好更改為dealWithMoney(...)

    public class NewFinancialService implements FinancialService
    {
    dealWithMoney(...)
    {
    payMoney(...)
    }
    }

    在這個(gè)子類中完成任務(wù)。然后注入到OrderService阿
    2005-12-06 10:03 | 小明

    # re: 基于事件分發(fā)機(jī)制的企業(yè)應(yīng)用開(kāi)發(fā)   回復(fù)  更多評(píng)論   

    如果FinancialService 不幸的被聲明為了final.
    如果又來(lái)了一個(gè)新子系統(tǒng)貨運(yùn)子系統(tǒng)C或者更多目前還未知的子系統(tǒng)需要通知訂單通知..
    還有很多如果如果...
    2005-12-06 11:32 | wolfsquare

    # re: 基于事件分發(fā)機(jī)制的企業(yè)應(yīng)用開(kāi)發(fā)   回復(fù)  更多評(píng)論   

    如果FinancialService 不幸的被聲明為了final. ?

    難道FinancialService 不是接口么?
    2005-12-06 11:55 | 小明

    # re: 基于事件分發(fā)機(jī)制的企業(yè)應(yīng)用開(kāi)發(fā)   回復(fù)  更多評(píng)論   

    我沒(méi)怎么看懂,還要學(xué)習(xí)呀,以后說(shuō)得詳細(xì)些,哈哈
    2007-03-08 16:53 | cljspn
    主站蜘蛛池模板: 乱人伦中文视频在线观看免费| 四虎影视永久免费观看| jizz中国免费| 亚洲码欧美码一区二区三区| 亚洲精品国产成人99久久| 国产亚洲精品看片在线观看| 国内精品免费视频自在线| 免费福利在线播放| 免费一区二区三区| 一道本在线免费视频| 亚洲av永久无码精品秋霞电影秋 | 久久91亚洲人成电影网站| 美女黄网站人色视频免费国产| 永久在线观看www免费视频| 99久久国产精品免费一区二区| 在线观看免费亚洲| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲无限乱码一二三四区| 久久精品国产亚洲AV麻豆~| 亚洲自偷自偷图片| 在线亚洲午夜理论AV大片| 亚洲精品国产电影| av无码东京热亚洲男人的天堂| 四虎影视www四虎免费| 女人18毛片a级毛片免费视频| 日本阿v免费费视频完整版| 亚洲电影在线免费观看| 老汉精品免费AV在线播放| 亚洲视频在线观看免费| 免费无码VA一区二区三区| 无码精品国产一区二区三区免费| 99精品视频免费| 久久免费美女视频| 国产免费网站看v片在线| 国产午夜精品理论片免费观看| 成人免费ā片在线观看| 天黑黑影院在线观看视频高清免费| caoporm碰最新免费公开视频| 国产免费人成视频尤勿视频| 中文字幕高清免费不卡视频| 99精品视频在线观看免费|