J2EE之巔

           

          Double Dispatch模式

          本文介紹了常見面向對象語言(Java,C#等)OverLoad對于運行時執行的方法邦定的局限,并且如何通過Double Dispatch來實現運行時行為邦定。

          根據對象來選擇行為問題

          public interface Event {

          }

          public class BlueEvent implements Event {

          }

          public class RedEvent implements Event {

          }

          public class Handler {

          public void handle(Event event){

          System.out.println("It is event");

          }

          public void handle(RedEvent event){

          System.out.println("It is RedEvent");

          }

          public void handle(BlueEvent event){

          System.out.println("It is BlueEvent");

          }

          }

          public class Main {

          public static void main(String[] args) {

          Event evt=new BlueEvent();

          new Handler().handle(evt);

          }

          }

          你認為運行結果是什么呢?

          結果:It is event

          是不是有點出乎意料,不是It is BlueEvent,這是應為Overload并不支持在運行時根據參數的運行時類型來幫定方法,所以要執行哪個方法是在編譯時就選定了的。

          2 Double Dispatch Pattern

          由于Java,C++及C#都具有上述局限,通常我們只能通過Switch或if結構來實現,當然這種實現方式既不優雅而且影響代碼的可維護性。

          通過以下的Double Dispatch Pattern便可以優雅的實現。

          public interface Event {

          public void injectHandler(EventHandler v);

          }

          public class BlueEvent implements Event {

          public void injectHandler(EventHandler v) {

          v.handle(this);

          }

          }

          public class RedEvent implements Event {

          public void injectHandler(EventHandler v) {

          v.handle(this);

          }

          }

          public class EventHandler {

          public void handle(BlueEvent e){

          System.out.println("It is BlueEvent");

          }

          public void handle(RedEvent e){

          System.out.println("It is RedEvent");

          }

          }

          public class Main {

          public static void main(String[] args) {

          Event evt=new BlueEvent();

          evt.injectHandler(new EventHandler());

          }

          }

          其實設計模式(GoF)中的Visitor模式就是Double Dispatch的一種應用。


          蔡超
          HP 軟件架構師
          軟件架構顧問
          SCEA,SCBCD,MCSD
          IBM Certified Solution Designer for OOA&D vUML2
          Chaocai2001@yahoo.com.cn,chao.cai@hp.com

          posted on 2009-02-19 21:02 超越巔峰 閱讀(2518) 評論(2)  編輯  收藏 所屬分類: Design Pattern

          評論

          # re: Double Dispatch模式 2009-02-20 09:10 ,,らSummer

          講解得非常清楚,感謝~~  回復  更多評論   

          # re: Double Dispatch模式 2009-02-21 10:09 ZelluX

          贊,不錯  回復  更多評論   

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 荣成市| 崇州市| 温宿县| 阿拉善右旗| 饶阳县| 高阳县| 宁阳县| 长顺县| 荣昌县| 周至县| 石阡县| 博乐市| 酒泉市| 益阳市| 伊川县| 密云县| 会理县| 衡水市| 京山县| 古浪县| 清新县| 高邑县| 揭东县| 日喀则市| 栾川县| 工布江达县| 勃利县| 昭平县| 出国| 宿松县| 平顶山市| 施秉县| 水富县| 潼关县| 银川市| 山丹县| 灵川县| 霍山县| 上犹县| 黑山县| 凤庆县|