EventBus
プログラムの構造を、レイヤー分割したコンポーネントで構成する場合、上位レイヤーから下位レイヤーのコンポーネントを呼び出すときは直接メソッドを呼びます。逆に、下位レイヤーから上位レイヤーを呼び出すときは、コンポーネント間で相互依存(循環参照)をすることは好ましくないので、コールバック(イベント通知)の機構を作ります。
Javaにも、オブザーバー・パターンを実装した java.util.ObserverとObservable、あるいはインタフェースを使った通知(イベントモデル)があります。しかしながら、継承の制約、通知種類毎にインタフェースを作成する、リスナーリストの管理を作りこむ、といった手間がかかります。
また、同一レイヤーの異なるコンポーネント間については、どちらが上位/下位かを決めるのは難しく、独立性を考えると直接メソッドを呼ぶ依存は設計上避けたいところです。
分散処理の世界なら、JMS(メッセージング)やCORBAのイベントサービス、ノーティフィケーション・サービス、Jiniなどがあります。
同じVM上で動くプログラム内で、これらと同じような機構を簡単に実現するものがないかと探していたら、EventBus というライブラリがありました。
2015-08-05追記 上記URLは無効になっており、mavenリポジトリから入手します。
http://mvnrepository.com/artifact/org.bushe/eventbus/1.4
日本語の情報がないか検索したら、過去の自分の日記がひっかかってしまいました。
どうやら再発見しただけのようです。ただ、他に日本語での紹介/解説情報は見当たりません。
EventBusに関する情報メモ
EventBusのホームページ(2015-08-06時点でリンク切れ)
オンライン Javadoc API(2015-08-06時点でリンク切れ)
ダウンロード(mavenのリポジトリから、バイナリjar、ソースjar、ドキュメントjarをダウンロードする)
ライセンスはApache License 2.0
Observer/Observableを使った通知をEventBusに書き換えるサンプルと解説記事
EventBusを使ったプログラムのユニットテスト方法
超抜粋のEventBusのコード断片と説明
かなり詳しいスライド資料(ドイツ語だがコード例中心でおおよそ分かる)
ちょっと古いスライド資料(EventBus開発者のbushe氏によるJavaOne 2006のBOF)