我試圖實現事件生成器成語(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中可以這樣做嗎?或者如果我瞭解錯誤的事情會更好?