use*_*638 13 java double-dispatch
在下文中,我希望EventHandler以一种方式处理EventA,以另一种方式处理EventB,以及以另一种方式处理任何其他事件(EventC,EventD).EventReceiver仅接收对Event的引用并调用EventHandler.handle().当然,总是被调用的版本是EventHandler.handle(事件事件).
不使用instanceOf,有没有办法多态调度(可能通过EventHandler或泛型中的另一个方法)到适当的句柄方法?
class EventA extends Event {
}
class EventB extends Event {
}
class EventC extends Event {
}
class EventD extends Event {
}
class EventHandler {
void handle(EventA event) {
System.out.println("Handling EventA");
}
void handle(EventB event) {
System.out.println("Handling EventB");
}
void handle(Event event) {
System.out.println("Handling Event");
}
}
class EventReceiver {
private EventHandler handler;
void receive(Event event) {
handler.handle(event);
}
}
Run Code Online (Sandbox Code Playgroud)
Pét*_*rök 14
听起来像应用(访问者模式的变体)的情况.(在主流的OO语言中,如C++,C#和Java,方法是单一调度,即一次只能在一种类型上进行多态.访问者允许实现双重调度.)
然而,这要求您也能够修改Event类,并创建从Events到(基本接口)的依赖关系EventHandler.
class EventA extends Event {
public handleBy(EventHandler eh) {
eh.handleEventA(this);
}
}
class EventB extends Event {
public handleBy(EventHandler eh) {
eh.handleEventB(this);
}
}
class EventHandler {
void handleEventA(EventA event) {
System.out.println("Handling EventA");
}
void handleEventB(EventB event) {
System.out.println("Handling EventB");
}
void handle(Event event) {
event.handleBy(this);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6756 次 |
| 最近记录: |