17.Observer パターン
- 2012/04/26 一部修正しました
- 17.1 Observerパターンとは
- 17.2 サンプルケース
- 17.3 Observerパターンまとめ
17.1 Observer パターンとは
第17章では Observer パターンを学びます。Observer とは、英語で「観察者」を意味する単語です。Observer パターンとは、状態の変化を観察することを目的としたものですが、どちらかというと「観察」よりも「通知」に重点の置かれたものになっています。
あるインスタンスの状態が変化した際に、そのインスタンス自身が、「観察者」に状態の変化を「通知」する仕組みです。例えば、飛行機の搭乗券について考えて見ましょう。飛行機の搭乗券を購入した人がキャンセルする必要に駆られた場合、航空会社に連絡してキャンセルする旨を伝えます。各搭乗者を管理しているのは「航空会社」で、キャンセルを伝えるのは「搭乗者」となっています。「搭乗者」は、チケットが欲しくなったり、いらなくなったりしたら「航空会社」に連絡します。ごく当たり前のことですが、このような仕組みによって、航空会社は全てのユーザを常に観察する必要からのがれられるのです。
このように、状態が変化する方が「通知」をする仕組みを持つことで、観察者は常に観察しなければいけない状態から開放されます。16章の Mediator パターンの一部でもこのような仕組みは利用されています。
Observer パターンは、このような通知の仕組みをより汎用的に利用できる形で提供するためのパターンです。
17.2 サンプルケース
サンプルケースでは、冬のマラソン大会に向けての生徒たちの練習についてみてみましょう。新人先生の学校では、毎年2月にマラソン大会が開催されます。このマラソン大会に向け、生徒たちは体育の時間やお昼休み、放課後などに校庭を走ることになっています。新人先生は生徒たちにがんばってもらうために、校庭を何週走ったかを毎日調査し、その累計を貼り出すことにしました。題して「栄冠への足跡」。
新人先生は、生徒が何週走ったかを調査するために、生徒が走る可能性のある時間帯は、常に校庭にいる必要がありました。頑張り屋の新人先生は、しばらくこれを続けていました。
ある日、ベテラン先生の教室を覗くと、新人先生のクラスと同じように、「何週走ったか表」が貼り出されていました。新人先生は、ベテラン先生に一歩近づけたような気がして喜びました。しかし、その数秒後、新人先生はとても重要なことに気がつきました。そう、新人先生は、校庭でベテラン先生を見かけたことがなかったのです!新人先生はベテラン先生のところに飛んで行きたずねました。
新人先生 : 生徒が校庭を何週走ったか、どうやって調べているんですか? ベテラン先生 : ん?
生徒に教えてもらっていますよ。生徒には、「校庭を走ったら、何週走ったか教えてください」って言ってあります。
寒いしね。新人先生 : なんとすばらしい。 翌日、新人先生は早速生徒たちに、「これからは校庭を走ったら、何週走ったかを先生に報告するようにしてください。」と伝え、生徒からの報告を待つようにしました。この状態をクラス図にすると、以下のようになります。
この形が、Observer パターンで利用される基本的な通知の形になります。生徒という「通知者」が、自分のステータスが変更された際に 「観察者」である先生に通知する。通知を受けた先生は、通知に合わせて、「栄冠への足跡」を更新する。このような通知の仕組みを Observer パターンを利用して設計・実装しておくことで、再利用性・拡張性の高いプログラムとなります。
Observer パターンのキモは、Observer インタフェースを用意するところにあります。Observer インタフェースでは、観察対象が変化した際に、観察対象からの通知を受ける窓口となる update メソッドを定義します。Observer パターンのキモはここにあります。次に、さらに一歩踏み込んで、観察対象となる Subject 抽象クラスを作成します。Subject 抽象クラスでは、Observer インスタンスを自由に追加するための、addObserver メソッドと、保持している Observer インスタンスの全てに変更を通知する notifyObservers メソッドを実装します。クラス図にすると、以下のようになります。
Observer パターンのような設計にしておくことで、観察者の追加、新たな Subject の追加などが容易に行えるようになります。
例えば、ある生徒は、別の Observer であるクラブの顧問の先生に、校庭を何週走っているかを報告するように指示を受けるかもしれません。
17.3 Observerパターンまとめ
Observerパターンの一般的なクラス図は、以下のようになります。
[引用] 『Java言語で学ぶ デザインパターン入門』(結城浩 ソフトバンクパブリッシング株式会社出版 2001年)