オブザーバ(デザインパターン)
あんまりホットな話題がない!
このままじゃただのデザインパターン紹介おじさんになってしまう。
apache spark (とhadoop), apache kafka , リアクティブプログラミング(RxJavaとかreactor-core) とかその他色々ざっと目を通してはいるんですが「ふーん、こういうものなんだ。」くらいのふわっとした感じで済ませてるんですよね。
あんまりどうでもよさそうなもの(というとアレですが)であれば概要だけ押さえてあとは必要になったときに勉強すればいいかなーくらいの感覚なのですが、上記の技術は今後扱う可能性もかなり高いと思うので機会があればちゃんとやっておいた方がいいと認識はしてます。
とりあえず、次回までに上記のどれか1個きっちり着手できたらなーと思います。(今回の記事と大きく関係のある、RxJava、reactor-coreとかが良さげ?)
以下本題、
Observerパターンとは、あるオブジェクトに対していくつかの監視者を設定し、オブジェクトの変更などを監視者に通知し、監視者は受け取った通知に応じてなんらかの処理をするという実装です。
JavaAPIではjava.util.Observerとjava.util.Observableインターフェースを実装することで実現できます。
以下が恒例のサンプルコードです。
ーーーーーーーーーーーーーーーーーーーーーー
実行結果
ーーーーーーーーーーーーーーーーーーーーーー
【通知】 Subjectのcountが1に変更されました。
【通知】 Subjectのcountが2に変更されました。
【通知】 Subjectのcountが3に変更されました。
あれ、、、先の例で挙げたインターフェース実装してないじゃん。。って思われたかもしれませんが、今回の例では他のオブジェクトの状態を変更するためのトリガーとして通知を出すわけでもないので関数インターフェースとの合わせ技で実装しています。ラムダやメソッド参照で書けるからすごく楽。
オブザーバ側の処理は面倒なので変更内容をsysoutするだけにしてますが、例えばオブジェクトの状態をオンメモリキャッシュに保存したりとまあここは用途に合わせてですね。
以上