#Adapter
目次
##目的
あるクラスのインタフェースをクライアントが求める他のインタフェースへ変換する。Adapterパターンはインタフェースに互換性のないクラス同士を組み合わせることができるようにする。
##構成要素
・Target 組み合わせたあとのクラスのインターフェースを定義する。
・Client 利用者クラス
・Adaptee 組み合わせたいクラス
・Adapter Adapteeクラスを組み合わせて作成したクラス
##実装
目的を読んで「そんなことできるがやろか」と思っていたらあるクラスに多重継承させて色々なクラスをまとめるような感じでした。GoF本のサンプルコードは基本的にC++で記述されているため、kotlin(もといjava)では実現できないようです。構造に関するパターンの一発目なのに。
色々調べてみるとjavaでadapterパターンを実現している(しようとしている?)ページが幾つかありました。
is-a関係
またはhas-a関係
の二つで実現することができる。とどのページでも書かれていましたがそれは本当にadapterパターンなのか…?と思います。
例えばTextViewクラス
とRectクラス
とColorBackgroundクラス
というのが標準ツールキットに含まれているけれど、今から作るシステムには角を丸くできて背景色を変更できるテキストビューが必要なんだ!!!というようなときに本パターンを用いるもんだと私は認識しています。
もしjavaで実現できるならば、下記のようなクラスができます。
※kotlinだとextendsとimplementsの見分けがつきにくいのでjavaでコーディングします。
public class ColorRectTextView extends TextView, Rect, ColorBackground {
// 角丸にしたり、背景色変更したりするメソッド
}
がしかし、javaは多重継承を許しません。これをis-a関係
やhas-a関係
で実現するとなると
public class IsAColorRectTextView extends TextView implements RectInterface, ColorBackgroundInterface {
// RectInterfaceとColorBackgroundInterfaceで定義されたメソッドを実装する
}
のような形や
public class HasAColorRectTextView extends TextView {
private Rect rect;
private ColorBackground colorBackGround;
public HasAColorRectTextView(Rect rect, ColorBackground colorBackGround) {
this.rect = rect;
this.colorBackGround = colorBackGround;
}
public void rectMethod() {
rect.rectMethod()
}
public void colorBackGroundMethod() {
colorBackGround.colorBackGroundMethod()
}
}
のような形になり単なる継承と委譲のような気がします。