我试图实现事件生成器成语(http://www.javaworld.com/javaworld/jw-09-1998/jw-09-techniques.html)。尽管如此,我觉得事情在可观察的课堂上有点“奇怪”。比方说,我有以下类:在Java中实现事件生成器成语
interface BakeryListener + orderReceived(BakeryEvent event) + orderProcessing(BakeryEvent event) + orderFinished(BakeryEvent event) + orderDelivered(BakeryEvent event) LogView, OrderReadyView etc. implements BakeryListener Creates a GUI for each own use Order VO/DTO object, used as the source in BakeryEvent BakeryDAO (the observable) - orders : Vector - listeners : Vector + takeOrder, cancelOrder, bake and other regular DAO methods, triggering an event by calling fireEvent + addBakeryListener(BakeryEvent event) + removeBakeryListener(BakeryEvent event) - fireEvent(Order source, EVENTTYPE????) BakeryGUI Creates/gets a reference to BakeryDAO. Creates and attaches LogView, OrderReadyView as listeners on BakeryDAO.
在我给他最初建议的链接“命名事件传播方法火[侦听器方法名。”。我觉得这是多余的:创建一个快照并迭代每个fire-method中的侦听器,当唯一改变的是在接口上调用哪个方法时。因此我做了一个单独的fireEvent方法,并且它正在工作。问题是使fireEvent中的事件参数的数据类型与BakeryListeners中定义的方法保持“同步”。目前fireEvent看起来像这样(节选):
for(BakeryListener listener : copyOfListeners){ if(eventType.equals("received")) listener.orderReceived(event); else if(eventType.equals("processing")) listener.orderProcessing(event); }
...等等。我想我可以用一个枚举,而不是一个字符串,使其无法调用fireEvent与不存在的事件类型,但我仍然必须将Type.RECEIVED映射到listener.orderReceived等?
fireEvent方法可能将BakeryListeners方法作为参数吗?即(伪代码)方法声明:
fireEvent(BakeryListeners.methods eventType, Order source)
,然后只是直接调用适当的方法内fireEvent(无如果/切换):
call(listener, eventType(source))
然后,它也将是不可能建立一个事件谁没有在界面BakeryDAO.takeOrder() - > fireEvent(eventWhoDoesntExist) - >异常中定义?
在Java中可以这样做吗?或者如果我了解错误的事情会更好?