J2EE之巔

           

          Double Dispatch模式

          本文介紹了常見面向?qū)ο笳Z言(Java,C#等)OverLoad對于運行時執(zhí)行的方法邦定的局限,并且如何通過Double Dispatch來實現(xiàn)運行時行為邦定。

          根據(jù)對象來選擇行為問題

          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);

          }

          }

          你認(rèn)為運行結(jié)果是什么呢?

          結(jié)果:It is event

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

          2 Double Dispatch Pattern

          由于Java,C++及C#都具有上述局限,通常我們只能通過Switch或if結(jié)構(gòu)來實現(xiàn),當(dāng)然這種實現(xiàn)方式既不優(yōu)雅而且影響代碼的可維護(hù)性。

          通過以下的Double Dispatch Pattern便可以優(yōu)雅的實現(xiàn)。

          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());

          }

          }

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


          蔡超
          HP 軟件架構(gòu)師
          軟件架構(gòu)顧問
          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 超越巔峰 閱讀(2527) 評論(2)  編輯  收藏 所屬分類: Design Pattern

          評論

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

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

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

          贊,不錯  回復(fù)  更多評論   

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 连江县| 麻城市| 汉阴县| 滦平县| 卢湾区| 河东区| 义乌市| 荃湾区| 敦化市| 浙江省| 博乐市| 贡山| 宝山区| 金华市| 南通市| 都昌县| 井冈山市| 景泰县| 康乐县| 鲁甸县| 泊头市| 买车| 张家川| 苏尼特右旗| 铜梁县| 彭山县| 桓台县| 巢湖市| 乌拉特前旗| 寿阳县| 定西市| 金湖县| 贵南县| 高密市| 凤庆县| 宜宾县| 东宁县| 中牟县| 珲春市| 罗平县| 来安县|