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

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

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

    隨筆 - 11, 文章 - 1, 評論 - 20, 引用 - 0
    數據加載中……

    基于事件分發機制的企業應用開發

        做過DOS編程的人都知道,Dos編程和Window編程最大不同之一就是事件機制的編程,普遍的,目前事件機制的使用已經在Windows下的應用程序中遍地開花了,可是基于事件傳播的應用僅僅限于window應用程序嗎?答案是:不。
        在IOC概念的不斷沖擊下,我們需要回頭去審視前兩年自己開發的,心中為之驕傲的,認為非常優秀的程序,在這過程中,我們就會看到這些驕傲在最新的概念沖擊下煙消云散了。變成了丑陋的,緊耦合的反面范例。讓我們來看看以下場景:

     某公司有基于某平臺的兩子系統,訂購系統A和財務系統B。當采購員在預采購某物品前,先在定購系統A中登記需要購買的貨物和價格,然后財務系統B就開始該筆購物款項的申請流程。
     首先讓我們來看看兩年前的代碼是怎么實現的:

     

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

     }


    從上面的代碼中可以很明顯看到,定購系統A和財務子系統發生了耦合,也許有同志說,那我采用Spring等IOC框架來解耦:
     

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

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

     }


    財務子系統B的實現FinancialServiceImpl是通過Spring等IOC框架設置進去的。這樣不是很完美了嗎?

    但是我仍然要說,這個只是五十步笑百步罷了。再請看以下場景:該公司的業務規則起了變化,金額少于1萬元的定購不需要通過財務申請流程。這樣財務子系統B升級到B2了,多了一個直接撥款的API payMoney()。這時候,定購系統該怎么辦?除了修改代碼沒有別的辦法。這個時候,基于事件分發處理的機制就大派用場了。
      修改原來的訂單系統實現下單消息的廣播。
     

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

     }

     

     實現一個消息監聽器:

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

     }

     

     在配置中設置(這里我們使用的是Spring)
     <bean id="orderService" ...>
      <property name="eventListener">
       <list>
        <ref local="orderListener"/>
       </list>
      </property>
     </bean>
     <bean id="orderListener" ...>

     這樣我們就實現了訂單系統和財務系統的解耦,如果財務系統發生的修改,我們就只需實現新的監聽器就可以了:

     

    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的概念來將系統提高到更高的抽象層次。
     (全文完)

    posted on 2005-12-05 20:31 wolfsquare 閱讀(2305) 評論(4)  編輯  收藏 所屬分類: 企業應用

    評論

    # re: 基于事件分發機制的企業應用開發   回復  更多評論   

    我說一下我的一小點看法

    對于你的代碼
    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());
    }
    }

    我覺得當遇到你說的情況時,我同樣可以Create another impl class來完成這個任務阿
    當然FinancialService 的接口最好更改為dealWithMoney(...)

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

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

    # re: 基于事件分發機制的企業應用開發   回復  更多評論   

    如果FinancialService 不幸的被聲明為了final.
    如果又來了一個新子系統貨運子系統C或者更多目前還未知的子系統需要通知訂單通知..
    還有很多如果如果...
    2005-12-06 11:32 | wolfsquare

    # re: 基于事件分發機制的企業應用開發   回復  更多評論   

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

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

    # re: 基于事件分發機制的企業應用開發   回復  更多評論   

    我沒怎么看懂,還要學習呀,以后說得詳細些,哈哈
    2007-03-08 16:53 | cljspn
    主站蜘蛛池模板: 亚洲国产成人精品不卡青青草原| 女人18毛片a级毛片免费视频| 国产日韩AV免费无码一区二区三区| 男女猛烈xx00免费视频试看| 亚洲精品无码专区| 一本天堂ⅴ无码亚洲道久久| 最近免费中文字幕视频高清在线看 | 成人AV免费网址在线观看| 最近中文字幕高清免费中文字幕mv| 久久久久免费看黄a级试看| 久久久久成人片免费观看蜜芽| 18禁超污无遮挡无码免费网站| 美女在线视频观看影院免费天天看| 久久青草91免费观看| 99re在线这里只有精品免费| 永久免费视频网站在线观看| 91麻豆最新在线人成免费观看 | 真正全免费视频a毛片| 精品一区二区三区无码免费直播 | 亚洲国产成人久久精品影视| 亚洲天堂中文资源| 亚洲另类古典武侠| 亚洲性无码AV中文字幕| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲精品美女在线观看播放| 亚洲午夜精品一区二区公牛电影院| 亚洲一级免费视频| 日韩色视频一区二区三区亚洲 | 亚洲福利视频网址| 亚洲高清中文字幕免费| 亚洲AV永久无码精品| 亚洲精品视频在线观看视频| 亚洲色大成网站www久久九| 在线观看亚洲视频| 91精品成人免费国产| 91网站免费观看| 免费国产人做人视频在线观看| 日韩精品亚洲aⅴ在线影院| 1区1区3区4区产品亚洲| 亚洲午夜无码久久久久软件| 一级特黄a大片免费|