デザインパターン - Adapter
「オブジェクト指向のこころ」読書記録。
GoF のデザインパターンにある Adapter パターンについて。
Adapter?
adapt を辞書で調べると以下のように書かれている。
adapt
http://ejje.weblio.jp/content/adapt
1. a 〈言行・風習などを〉〔…に〕(修正改変して)適合させる
b [adapt oneself で] 〔新しい環境などに〕順応する,慣れる
2. a 〈建物・機械などを〉〔用途に合わせて〕改造する
b 〈小説・劇を〉〔…向きに〕改作する,脚色する
ざっくり
Adapter(あだぷた)パターンは適合させるパターン。
既存クラスに別のインタフェースを持たせることで、特定のインタフェースに適合させる。ラッパ的な何か。
イメージ
オブジェクト指向パラダイムにおけるキーワードのひとつにポリモーフィズム(polymorphism)がある。
日本語に訳すと「多くの形態」「多態」「多様性」。
同じ参照方法で、さまざまなクラスに定義されているそれぞれの振る舞いを引き出すこと。
ポリモーフィズムを利用した設計
特定のインタフェースを持つ抽象クラスから派生した、いくつかの具象クラスがあるとする。派生先ではクラスごとに振る舞いを実装している。
このような設計により、クライアントはどのオブジェクトに対しても同じ方法で参照することができる。
クライアント側で意識しなければならないことが減るっていいですね。
異なるインタフェースを持つクラス
たとえばここで上記のクラス群に、インタフェースの異なる既存クラスを追加する必要が出てきた場合どうしたらよいか。
既存クラスはすでにどこかで使われているためインタフェース変更はできない。
このとき、以下のようなラッパクラスを作成することで問題を回避できる。
かもしれない。
- クラス群と同じ抽象クラスを継承
- 既存クラスを保持する(あるいは既存クラスに委譲する)
拡張性を保つ
「アジャイルソフトウェア開発の奥義」には Adapter パターンを用いることにより、以下の原則が満たされると書かれている。
- オープン・クローズドの原則(OCP)
- 拡張に対して開いていなければならない
- 修正に対して閉じていなければならない
- リスコフの置換原則(LSP)
- 派生型はその基本型と置換可能でなければならない
まとめ
- 既存クラスを特定のインタフェースに適合させるのが Adapter パターン
- Adapter パターンを用いることにより、Adaptee(既存クラス)を修正することなく、別のインタフェースに適合させることができる
- Adapter クラスは必要なインタフェースを保持したラッパ
- Adapter クラスによりクライアントは、 Adaptee を Adapter クラスの派生元と同じように使用することができる(ポリモーフィズム)