本文介紹了常見面向?qū)ο笳Z言(Java,C#等)OverLoad對于運(yùn)行時執(zhí)行的方法邦定的局限,并且如何通過Double Dispatch來實現(xiàn)運(yùn)行時行為邦定。
1 根據(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)為運(yùn)行結(jié)果是什么呢?
結(jié)果:It is event
是不是有點出乎意料,不是It is BlueEvent,這是應(yīng)為Overload并不支持在運(yùn)行時根據(jù)參數(shù)的運(yùn)行時類型來幫定方法,所以要執(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