復習:Memento
今回はMementoパターンの復習です。
Mementoパターン
状態の保存を行うパターンです。
状態に必要な情報をインスタンスとして保存します。
また、そのインスタンスから元の状態に復帰する機能もつけます。
アンドゥ機能などを実装する際に役に立つパターンでしょう。
このパターンは以前のオブジェクトの状態の再現を目的としています。
このパターンでは現在の自分の状態を保存し、Mementoとして作成するOriginator
保存された状態を表現するMemento
Memento保存の要請を出したり、保存されたMementoをどこかに保持しておき、復帰の際にそれを渡すなどの処理を行うCaretakerの3種類の役があります。
広いインターフェースと狭いインターフェース
Memento役はOriginator役の情報を保存し、復帰できるようにしなくてはならないので、必然的にOriginator役の情報を全て持っています。
つまり、Originator役における隠蔽情報はMemento役に対しては、隠蔽されていません。
しかし、オブジェクト指向の考えに則るならば、Originator役の隠蔽情報はMemento役以外には隠蔽されなくてはなりません。
Memento役に対する情報隠蔽とMemento役以外に対する情報隠蔽の2種類を使い分ける必要があるわけです。
復習:Observer
今回はObserverパターンについての復習です。
Observerパターンは複数のオブジェクトがひとつのオブジェクトを監視する際に使用するパターンです。
Observerパターン
通知とそれに対する処理を行うパターン。
subject、被観察者とobserver、観察者の2つのオブジェクトがある。
Subjectは全てのobserverを登録するリストを持つ。
変化が起こった時、Subjectは予め登録されたobserverに対してどのような変化が起きたかを通知する。
その際、各observerに実装されている特定のメソッドupdateを自分自身もしくは、変化について分かる値を引数として呼び出す。
updateメソッドを呼び出されたobserverは、引数からsubjectの情報を取得し、それに対する処理を行う。
どのような値を引数としてもたせるか、subjectとobserverの関係をどのようなものにするかなどは実装によって異なる。
復習:Mediator
今回はMediatorパターンの復習です。
Mediatorパターンは、複数のオブジェクトが相互に作用し、状態を変更させるようなときに使用するパターンです。
全てのオブジェクトを統括するクラス(Mediator)を用意します。
個々の部品となるクラス(Colleague)は自分の状態変化を調停者に知らせ、調停者は個々のオブジェクトの状態に応じた全体の状態を調整します。
全ての状態や動作を調停者に記述することで、プログラムの保守性が高くなります。
もし、この個々のクラスの状態による動作を各クラスに記述していると、コードが分散することになり、保守性が低下します。
状態の遷移などが相互に作用するような複雑なアプリケーションを作成する場合、Mediatorパターンを用いたほうがスマートに記述できるのかもしれません。
ColleagueとMediatorの関係
全てのcolleagueは調停者mediatorに変化を知らせるメソッドを持つ、変化を受け取った調停者は変化に対して他のcolleagueを変化させる。
個々のcolleagueが連動して動くとき、その動きを調停者側に全て書き込むことによってコードの分散を防ぎ、保守性を高く保つ。
Mediator自身の動作はアプリケーションに依存しているため、再利用性は低い。
典型例はGUIプログラム
復習:Facade
今回はFacadeパターンの復習です。
Facadeパターンは複雑な処理に関する操作の窓口をシンプルにすることで
クラスの操作を簡略化しているパターンです。
複雑なものを単純に見せる、裏で動いている処理を隠蔽することで単純化しています。
Facadeパターンがしていることはそれほど多くなく、デザインパターンの中ではむしろ単純な部類ですね。
Facadeパターンは外部から見える部分を少ないので、外部との繋がりを薄くすることができます。
そうすることで、クラス間の繋がりが疎となり、再利用性の高いクラスが記述できます。
Facadeパターンはクラスの設計の技法と言うよりは、リファクタリングの技法に近いのかもしれません。