読者です 読者をやめる 読者になる 読者になる

kyosho5’s blog

貧乏で数学があまり得意ではない理系出身のエンジニアのブログ

デザインパターン勉強メモ⑨

第17章 Observerパターン

観察対象の状態が変化したときに、観察者に通知され、状態変化に応じた処理を記述する。

・Subject役
→観察される側。観察者であるObserver役を登録するメソッドと削除するメソッドを持つ。
また、現在の状態を取得するメソッドを持つ。

・ConcreteSubject役
→具体的な観察される役。状態の変化を登録されているObserver役に伝える。


第18章 Mementoパターン

インスタンスの状態を表す役割を導入して、カプセル化の破壊に陥ることなく保存と復元を行うパターン
インスタンスへ不用意にアクセスを許してしまい、そのクラスの内部構造に依存したコードがプログラムのあちこちに分散してしま
クラスの修正がしにくくなることをカプセル化の破壊という。

Mementoパターンを用いて、プログラムに対して
undo、redo、history、snapshotを行うことができる。

・Originator役
→自分の現在の状態を保存したいときにMemento役を作る。
以前のMemento役を渡されると、そのMemento役を作ったときの状態に戻る処理を行う。

・Memento役
→Originatorの内部情報をまとめる。その情報は誰にでも公開するわけではない。Memento役は以下のインタフェース(API)を持っている。
wide interface
→オブジェクトをもとの状態に戻すために必要な情報がすべて得られるメソッドの集合。Memento役の内部情報をすべてさらけ出してしまうため、Oiriginator役のみが扱える。

narrow interface役
→外部のCaretaker役に見せる。できることに限りがあり、内部状態が外部に公開されるのを防ぐ。
できることが少ない=narrow

以上の使い分けによって、オブジェクトのカプセル化の破壊を防ぐことができる。

・Caretaker役
→現在のOriginator役の状態を保存したいときに。そのことをOriginator役に伝える。Originator役はそれを受けてMemento役を作り、Caretaker役に渡す。
Caretakerは将来の必要に備えて、そのMemento役を保存しておく。
narrow interfaceしか使えないので、Mementoの内部情報にアクセスすることはできない。作成されたMementoをブラックボックスとして保存しておくことのみができる。(Memento役はCaretaker役に対して情報隠ぺいを行っている。)

Mementoをメモリ上だけでなくファイルとして保存しておく際には、将来の改修やバージョンアップの際に整合性が取れなくなる可能性があるので賞味期限を考慮する必要がある。

CaretakerとOriginatorを分けることで役割分担が実現できる。
OriginatorはMementoの作成と、与えられたMementoを使って自分の状態を元に戻すということのみに限っているため、
undoの方法などを変更するときに変更の影響を受けない。