- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现事件生成器习惯用法( http://www.javaworld.com/javaworld/jw-09-1998/jw-09-techniques.html )。不过,当涉及到可观察类时,我发现事情有点“奇怪”。假设我有以下类(class):
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 useOrder 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.
In the link I gave initially he recommends to "Name the event propagator method fire[listener-method-name].". I find this to be redundant: making a snapshot and iterating over the listeners in each fire-method, when the only thing changing is which method to call on the interface. Thus I have made a single fireEvent method, and it is working sort of. The problem is to keep the datatype of the event parameter in fireEvent "in sync" with the methods defined in BakeryListeners. Currently the fireEvent looks like this (excerpt):
for(BakeryListener listener : copyOfListeners){ if(eventType.equals("received")) listener.orderReceived(event); else if(eventType.equals("processing")) listener.orderProcessing(event);}
... etc. I guess I could use an enum instead of a string to make it impossible to call fireEvent with an eventType that doesn't exist, but I still have to map Type.RECEIVED to listener.orderReceived etc?
Is it possible for the fireEvent method to take the BakeryListeners methods as a parameter? I.e (pseudo-code) method declaration:
fireEvent(BakeryListeners.methods eventType, Order source)
然后直接在 fireEvent 中调用适当的方法(无需 if/switching):
call(listener, eventType( source))
那么也不可能创建未在接口(interface) BakeryDAO.takeOrder() -> fireEvent(eventWhoDoesntExist) -> 异常中定义的事件?
用Java可以做到这一点吗?或者如果我理解错误的话更好的方法?
最佳答案
我认为枚举事件类型并将事件类型包含在事件中比每个事件类型一个方法更清晰。
首先,您可以避免所有面包师监听器必须实现所有方法,然后如果他们只对一个事件感兴趣,则将它们留空。 (你实现过MouseListener吗?)
其次,当您发现需要 orderBilled 和 orderPaied 时,您可以稍后添加到枚举中,而无需向所有不需要处理该类型事件的监听器添加更多方法。
public class BakeryEvent {
public enum Type { Received, Processing,Finished,Delivered,Billed,Paied };
private Type myType;
private Order myOrder;
BakeryEvent( Order order, BakeryEvent.Type bet ) {//...
}
//...
}
public interface BakeryListener {
public void handleBakeryEvent( BakeryEvent be );
}
然后
public class OvenScheduler implements BakeryListener {
public void handleBakeryEvent( BakeryEvent be ){
if ( BakeryEvent.Type.Received.equals(be.getEventType() ) {
scheduldeOven( be.getOrder() );
}
}
// hey look I don't have to implement orderBilled() and then do nothing!
}
关于java - 在 Java 中实现事件生成器习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/806282/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!