隨筆 - 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 閱讀(2310) 評論(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
          主站蜘蛛池模板: 乐平市| 淮南市| 丹江口市| 衡阳市| 郓城县| 神池县| 天台县| 泸水县| 阳西县| 安图县| 江华| 巴林左旗| 渝北区| 镇远县| 墨竹工卡县| 临武县| 武乡县| 娱乐| 韩城市| 凤凰县| 车险| 麦盖提县| 衡南县| 裕民县| 株洲市| 广河县| 南阳市| 抚顺市| 内乡县| 彭阳县| 建宁县| 渭源县| 鸡东县| 罗定市| 云阳县| 浪卡子县| 博罗县| 通城县| 南阳市| 深泽县| 孟连|