【Gang of Four】デザインパターン学習 - Adapter


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でコーディングします。

ColorRectTextView.java

public class ColorRectTextView extends TextView, Rect, ColorBackground {
    // 角丸にしたり、背景色変更したりするメソッド
}

がしかし、javaは多重継承を許しません。これをis-a関係has-a関係で実現するとなると

IsAColorRectTextView.java
public class IsAColorRectTextView extends TextView implements RectInterface, ColorBackgroundInterface {
    // RectInterfaceとColorBackgroundInterfaceで定義されたメソッドを実装する
}

のような形や

HasAColorRectTextView.java
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()
    }
}

のような形になり単なる継承と委譲のような気がします。