Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [② Adapter]

概要

adaptは日本語で「適合させる」,adapterは日本語で「適合させるもの」という意味になる.adapterパターンは,インターフェースに互換性の無いクラス同士を組み合わせ,インターフェースを変換するためのパターンである.

Adapterパターンの主な要素は以下である.

  • Target:新規のインターフェース
  • Adaptee:Adapterによってラップされる,既存クラスのインターフェース
  • Adapter:AdapteeのインターフェースをTargetのインターフェースに適合させるためのクラス

Adapteeクラスは既存のクラスであり,修正できないものとしている.

ここで,Adapteeクラスを利用したい開発者がいて,その開発者はTargetインターフェースで定義されているメソッドを使いたい(内部の処理はAdapteeクラスのメソッド)ケースがAdapterパターンの使いどころである.

クラス図

継承を利用
画像が読み込まれない場合はページを更新してみてください。

委譲を利用
画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

Adapterパターンを実現するための手法として,継承を利用するケースと以上を利用するケースが存在する

継承を利用
java// Target Interface
interface Target {
    void request();
}

// Adaptee
class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee specificRequest");
    }
}

// Adapter
class Adapter extends Adaptee implements Target {
    public void request() {
        specificRequest();
    }
}

// Client
public class AdapterPattern {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}
委譲を利用
java// Target Interface
interface Target {
    void request();
}

// Adaptee
class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee specificRequest");
    }
}

// Adapter
class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();

    public void request() {
        adaptee.specificRequest();
    }
}

// Client
public class AdapterPattern {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}

まとめ,所感

処理内容は既存クラスのものを使いたくて,メソッド名だけ変えたいときにAdapterパターンを使う?それってどんな時?

どちらかというと逆で,メソッド名を変えたいのではなく,処理内容を変えたいというケースが個人的にしっくりくる.言い換えると,インターフェースは特定のものを使うのだけど,内部処理は別のクラスのものを使いたいとき.

ただやはり色々なサイトでは,「既存のクラスに対して修正を加えずにインターフェースを変更する」という説明が多い.うーん,わからん.

ちなみにORM(Object Relational Mapping)もアダプターの一種である.