Я пытаюсь реализовать идиому Event Generator (http://www.javaworld.com/javaworld/jw-09-1998/jw-09-techniques.html). Я нахожу вещи немного странными, когда дело доходит до наблюдаемого класса. Допустим, у меня есть следующие классы:
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 [listener-method-name]». Я считаю это избыточным: создание снимка и перебор слушателей в каждом методе fire, когда единственное, что меняется, - это какой метод вызывать на интерфейсе. Таким образом, я сделал единственный метод fireEvent, и он работает вроде. Проблема заключается в том, чтобы сохранять тип данных параметра события в fireEvent «синхронно» с методами, определенными в BakeryListeners. В настоящее время fireEvent выглядит следующим образом (отрывок):
for(BakeryListener listener : copyOfListeners){
if(eventType.equals("received")) listener.orderReceived(event);
else if(eventType.equals("processing")) listener.orderProcessing(event);
}
... и т. Д. Я думаю, я мог бы использовать enum вместо строки, чтобы сделать невозможным вызов fireEvent с несуществующим eventType, но мне все еще нужно сопоставить Type.RECEIVED с listener.orderReceived и т. Д.?
Возможно ли, чтобы метод fireEvent принял методы BakeryListeners в качестве параметра? I.e (псевдокод) объявление метода:
fireEvent(BakeryListeners.methods eventType, Order source)
, а затем просто вызовите соответствующий метод непосредственно внутри fireEvent (без if / switch):
call(listener, eventType( source))
Тогда также было бы невозможно создать событие, которое не определено в интерфейсе BakeryDAO.takeOrder () -> fireEvent (eventWhoDoesntExist) -> исключение?
Возможно ли сделать это на Java? Или лучше, если я неправильно понял?