Java言語で学ぶデザインパターン入門』を読んで、学んだ内容についてまとめます。ObserverパターンObserverとは「観察(observe)する人」のことで「観察者」を意味します。観察する対象の状態が変化する際に観察者に対して通知を行うパターンのことをObserverパターンと言います。詳しくは後述しますが、観察する対象が観察者に対して通知を行う必要があり、観察者は受動的な立場であることから、Publish-Subscribeパターンと呼ばれることもあるようです。登場人物Observerパターン使用するのは以下のクラス図に登場するクラスです。抽象クラスSubject観察される側となるクラスです。自身を観察するobservers(複数のobserver)とそれらを登録・削除・通知するメソッドや自身の状態を返すメソッドを持ちます。先ほど述べたように、観察される側であるはずsubjectが観察する側のobserverを保持している点が注意すべき点です。Observersubjectを観察する側のクラスです。観察と言ってもsubjectから通知されて初めて観察対象の状態が変化したことを知ります。実装クラスConcreteSubject具体的な観察される側となるクラスです。親クラスで宣言されている、自身の状態を返すgetSubjectStatusメソッドをオーバーライドします。ConcreteObserveer具体的な観察する側となるクラスです。親クラスで宣言されている、観察対象の状態が変化したことを通知されるためのupdateメソッドをオーバーライドします。具体例として、以下のクラスをもとに説明します。execute();}観察される対象のSubject役となるクラスです。観察者は複数存在することもあり得るためObserverをListで持っています。観察者を登録・削除するメソッドと、登録者に通知を行うためのメソッドも持っています。notifyObserversメソッドでは具体的な観察者たちに対してupdateメソッドを呼び出しています。generator);}NumGeneratorを観察する役となるクラスです。通知を受け取るためのupdateメソッドを宣言してますが、実装は継承するクラスに任せます。}}NumGeneratorを継承するクラスで具体的な観察対象役となるクラスです。乱数と現在の数を表すフィールドを持ち、数を取得するメソッドと数を生成するためのメソッドを持ちます。数を生成するメソッドでは10回ループを回しており、各ループの中では0~20の範囲内で乱数を取得し、その乱数を現在の数値に設定することで状態の更新を行っています。状態が更新されたことをnotifyObserversメソッドで各observerに通知します。}}Observerを実装する具体的な観察者の役となるクラスでupdateメソッドをオーバーライドしています。このメソッドは観察対象が更新を通知してきた際に具体的な観察者が行う処理を記述します。ここでは観察対象が持つ乱数(更新された現在の数)を表示します。}}DigitObserverと同様に具体的な観察者役となるクラスです。ここでは観察対象が持つ乱数(更新された現在の数)を引数として、ランダムなアルファベットからなる文字列を表示しています。}}具体的な観察対象の生成と、具体的な観察者を観察対象に登録する処理を行った後、数の生成を行うことで状態を更新しています。実行結果Mainクラスを実行した結果は以下となります。乱数と乱数の桁数分のランダムな文字列を表示を10回行っていることが分かります。※乱数を利用しているため表示結果は異なります。実行結果ループカウント:1DigitObserver:14StringObserver:VNXxKnJCmkbOSG----------------------------------------ループカウント:2DigitObserver:15StringObserver:FUBpVQotKbSwmMX----------------------------------------ループカウント:3DigitObserver:6StringObserver:onRlXn----------------------------------------ループカウント:4DigitObserver:18StringObserver:AehtMZiGkzYgapTgok----------------------------------------ループカウント:5DigitObserver:8StringObserver:XuRUWXnb----------------------------------------ループカウント:6DigitObserver:11StringObserver:JHYAeuMfMDO----------------------------------------ループカウント:7DigitObserver:12StringObserver:sopRShHkheIO----------------------------------------ループカウント:8DigitObserver:11StringObserver:BLATKGBDccR----------------------------------------ループカウント:9DigitObserver:18StringObserver:kmSHMbZZftRyGkpaqa----------------------------------------ループカウント:10DigitObserver:15StringObserver:muYkfeGLfwYqykD----------------------------------------メリットObserverパターンを利用することで、状態を保持するクラスと状態の変化を通知してもらうクラスを分けることができ、クラスの再利用性(部品化)が高まります。使いどころObserverパターンの使いどころとして、MVCモデルの実装におけるモデルとビューの連携があげられます。モデルは内部的なデータであり、コントローラーがモデル(観察対象)の状態の変化を検出し、ビュー(観察者)に通知することで連携を行います。まとめオブジェクトの状態の変化を通知するObserverパターンに関して学びました。以下でサンプルコードをアップしていますのでよろしければ参考にどうぞ。Observerサンプルコードまた、他のデザインパターンに関しては以下でまとめていますので、こちらも参考にどうぞ。requestStockLike1@mk777SIer→Webに転職したエンジニア。学んだことなどをまとめていきます。upLoginユーザーは見つかりませんでした。