増補改訂版 Java言語で学ぶデザインパターン入門を途中セクションまで読みました。
今更体系的に学ぶデザインパターン。下記もいつかやりたい。
雑メモ
- Iterator
- client 側で、捜査対象の実装を気にしなくて済む
- Adapter
- 継承と委譲パターンがある
- interface またはクラスを仲介することで、テスト済みのクラスを再利用できる
- e.g. v1 のクラスを使った v1 のプログラムがある →クラスを v2 にアップデートしたときに、v2 のクラスを adaptee (適合される側)として隠蔽し、 v2 → v1 の変換をする adapter を実装することで、両方のバージョンを共存できる
- Template Method
- 抽象クラスを継承した、サブクラスでメソッドを定義する
- 抽象クラスの方で、処理の大枠を定義しておく
- Factory Method
- Template Method の応用
- 抽象的な Creator / Product と具体的な Creator / Product を定義
- Instance の生成をサブクラスに集約し、抽象的な Creator / Product の再利用性を高める
- Singleton
- Prototype
- instance を作るときに、クラスからではなく他の instance を複製する
- Builder
- Director と Builder を組み合わせることで、インスタンスの生成過程を抽象化する
- Directorクラスは Builder クラスの実装を意識しなくて良くなる
- Abstract Factory
- 抽象的な Product / Factory と具体的な Product / Factory を定義する
- Bridge
- 機能と実装の 抽象クラスを分けることで、機能の拡張が楽になる
- 実装側のクラスの method を委譲の形で実行する
- Strategy
- 委譲先のクラスを切り替えることで、アルゴリズムを実行時に任意のものに出来る
- (使い道があんまり分からなかった)
- Composite
- Leaf / Composite / Component が登場し、 Leaf / Composite を Component として同一視する
- 「複数と単一の同一視」により、再帰的な実装ができる
- Decorator
- Composite に似てるが、再帰的に外枠に機能追加する
- Visitor
- Visitor (訪問者) と、 Element (要素) に分ける
- データ構造とその要素に対する処理を分離できる
- Chain of Responsibility
- Handler (処理者) と Client (要求者) に分ける
- Handler は 抽象クラスである
- ConcreteHandler (Handler のサブクラス) で、どのように解決するかのロジックを書く
- ConcreteHandler をどの順番で解決させるかを Main method で書く
- Facade
- Facade は建物の正面の意味
- 複雑なクラス同士の関係や前提条件を Facadeクラスに隠蔽する
- Mediator
- UI の有効・無効化のロジックを Mediator (調停者)の役に回す
- UI は Colleague (同僚) として実装し、有効・無効化は自身では意識しない
- Observer
- Subject (被験者) と Observer (観察者) を実装し、Subject の変更を Observer に通知する
- Memento
- あるインスタンスの保存と復元を行うためのデザインパターン
- Originator Memento Caretaker が登場する
- Caretaker が一連の操作を行う
- スナップショットが必要なタイミングで Caretaker が Originator に依頼をする
- Caretaker は Originator から Memento を受け取り保存する
- Caretaker は保存しておいた Memento をよしななタイミングで Originator に渡す
- Originator が Memento から情報の復元を行う
- State
- State は interface であり、各「状態」に依存したメソッドの集まり
- State を実装するクラスで層を分けることで、各 UI のイベントハンドラーで条件分岐しなくて良くなる
- Context (状況) の役があり、現在の状態を持つ
- Flyweight
- Flyweight を共有して使う
- FlyweightFactory の役は hash などを用いて、 Flyweight のインスタンスを重複して持たないようにする
- Proxy
- Proxy は代理人であり RealSubject は本人役
- Subject は両者を同一視するための interface
- Proxy が可能な限り処理を代替わりし、必要になってから RealSubjectクラスを生成する
- Command / Interpreter