イベントジェネレータのイディオム(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.
「イベントプロパゲータ法の火[リスナーメソッド名]を名前を。」。これは冗長であることがわかります。スナップショットを作成し、各ファイアメソッドでリスナーを繰り返します。変更するのはインターフェイス上で呼び出すメソッドだけです。したがって、私は単一のfireEventメソッドを作成しました。問題は、fireEventのイベントパラメータのデータ型を、BakeryListenersで定義されているメソッドと同期して保持することです。現在、fireEventこの(抜粋)のようになります。
for(BakeryListener listener : copyOfListeners){ if(eventType.equals("received")) listener.orderReceived(event); else if(eventType.equals("processing")) listener.orderProcessing(event); }
...など私は私はそれは不可能に存在しないのeventTypeでfireEventを呼び出すために作るために文字列の代わりに列挙型を使用することができると思いますが、私はまだlistener.orderReceivedなどにType.RECEIVEDをマップする必要がありますか?
fireEventメソッドは、BakeryListenersメソッドをパラメータとして使用できますか?すなわち、(擬似コード)メソッド宣言:
fireEvent(BakeryListeners.methods eventType, Order source)
した後だけ(IF /スイッチングすることなく)直接fireEvent内部に適切なメソッドを呼び出す:
call(listener, eventType(source))
イベントを作成することは不可能であろうBakeryDAO.takeOrder() - > fireEvent(eventWhoDoesntExist) - >例外?
Javaでこれを行うことはできますか?私が間違ったことを理解していれば、より良い方法でしょうか?