Ich versuche, die Event Generator Idiom (http://www.javaworld.com/javaworld/jw-09-1998/jw-09-techniques.html) zu implementieren. Ich finde die Dinge ein wenig "seltsam", wenn es um die beobachtbare Klasse geht. Lassen Sie uns sagen, dass ich die folgenden Klassen:Implementierung von Event-Generator Idiom in 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.
In den Link habe ich anfangs empfiehlt er, „das Ereignis Verbreiter Methode Feuer Name [Hörer-method-name].“. Ich finde, dass dies redundant ist: einen Snapshot erstellen und über die Listener in jeder Fire-Methode iterieren, wenn nur die Methode geändert wird, die auf der Schnittstelle aufgerufen wird. So habe ich eine einzige FireEvent-Methode gemacht, und es funktioniert irgendwie. Das Problem besteht darin, den Datentyp des Ereignisparameters in FireEvent "synchron" mit den in BakeryListeners definierten Methoden zu halten. Derzeit ist die fireevent wie dieser (Auszug) aussieht:
for(BakeryListener listener : copyOfListeners){ if(eventType.equals("received")) listener.orderReceived(event); else if(eventType.equals("processing")) listener.orderProcessing(event); }
... usw. ich denke, ich eine Enumeration anstelle einer Zeichenfolge verwenden könnte es unmöglich zu machen, fireevent mit einem eventtype zu nennen, die nicht existieren, aber Ich muss Type.RECEIVED immer noch zu listener.orderReceived usw. zuordnen?
Kann die fireEvent-Methode die BakeryListeners-Methoden als Parameter verwenden? Ie (Pseudocode) -Methode Deklaration:
fireEvent(BakeryListeners.methods eventType, Order source)
und rufe dann nur die entsprechende Methode direkt in fireevent (ohne if/switching):
call(listener, eventType(source))
Dann wäre es auch unmöglich sein, ein Ereignis zu erstellen wer ist nicht in der Schnittstelle BakeryDAO.takeOrder() definiert -> fireEvent (eventWhoDoesntExist) -> Ausnahme?
Ist es möglich, dies in Java zu tun? Oder ein besserer Weg, wenn ich die Dinge falsch verstanden habe?