我有以下(可能是常见的)问题,它目前绝对让我困惑不解:
有两个生成的事件对象,它们扩展了抽象类Event
,我想将它们划分为会话Beans,例如
public void divideEvent(Event event) {
if (event instanceof DocumentEvent) {
documentGenerator.gerenateDocument(event);
} else if (event instanceof MailEvent) {
deliveryManager.deliverMail(event);
...
}
...
}
但是将来可能会有两种以上的事件类型,所以if-else会很长,而且可能无法读取。此外,我认为instanceof
在这种情况下并不是真正的“最佳实践”。
我可以向Event
类型添加一个抽象方法,并让它们自己分开,但然后我必须在每个实体中注入特定的会话Beans。
对于这个问题,有没有什么“漂亮”的解决方案呢?
谢谢你的帮助!
发布于 2011-05-28 05:28:46
最简单的方法是让事件提供一个您可以调用的方法,以便事件知道要做什么。
interface Event {
public void onEvent(Context context);
}
class DocumentEvent implements Event {
public void onEvent(Context context) {
context.getDocumentGenerator().gerenateDocument(this);
}
}
class MailEvent implements Event {
public void onEvent(Context context) {
context.getDeliveryManager().deliverMail(event);
}
}
class Context {
public void divideEvent(Event event) {
event.onEvent(this);
}
}
发布于 2011-05-28 05:26:02
每个事件都有一个函数,比如do。每个子类覆盖都会执行(:P)相应的操作。动态分派会在之后执行其他所有操作。您所需要做的就是调用event.do()
发布于 2011-05-28 05:46:56
我没有评论的权利,我也不知道确切的答案。但是,只有我还是这里的一些人建议使用重载(在编译时发生,因此只会生成编译错误)来解决这个问题?
这只是一个例子。如您所见,它将不会编译。
package com.stackoverflow;
public class Test {
static abstract class Event {}
static class MailEvent extends Event {}
static class DocEvent extends Event {}
static class Dispatcher {
void dispatchEvent(DocEvent e) {
System.out.println("A");
}
void dispatchEvent(MailEvent e) {
System.out.println("B");
}
}
public static void main(String[] args) {
Dispatcher d = new Dispatcher();
Event e = new DocEvent();
d.dispatchEvent(e);
}
https://stackoverflow.com/questions/6157835
复制相似问题