Design Pattern | Adapter Pattern(アダプターパターン)

Adapterパターンとは?

  • Adapterという英単語は、適合させるものという意味である。
  • Adapterパターンは、すでに提供されているものをそのまま使えない場合に、必要な形へ変換して利用するための方式である。つまり、インターフェースを変更するための方式である。
  • アダプターは、電圧が合わないときに間に接続する変換プラグを考えるとよい。
  • パターンでも、両側に互いに合わないインターフェースがあるなら、この2つをつなげるBridgeを作ればよい。
  • 継承を利用する方法と委譲を利用する方法がある。
    • クラスによるAdapter Pattern
      • 継承を利用したAdapter Patternである。
    • インスタンスによるAdapter Pattern
      • 委譲を使用したAdapter Patternである。
  • ラッパーパターンとも呼ばれる。ラッパーは包むものを意味する。
  • GoFのデザインパターンでは、構造に関するデザインパターンに分類される。

Adapterパターンのサンプルプログラム

学生の名前と年齢を表示するサンプルプログラムである。

1. クラス継承を利用した方法

Class Diagram
Adapter Pattern Class Diagram

1-1. Humanクラス

もともと提供されたクラスである。

Human.java

package com.devkuma.designpattern.structural.adapter.ex1;

public class Human {

    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printName() {
        System.out.println(name);
    }

    public void printAge() {
        System.out.println(age);
    }
}

1-2. Studentインターフェース

必要なインターフェースである。

Student.java

package com.devkuma.designpattern.structural.adapter.ex1;

public interface Student {
    void showName();

    void showAge();
}

1-3. HumanAdapterクラス

Adapter役となるクラスである。

HumanAdapter.java

package com.devkuma.designpattern.structural.adapter.ex1;

public class HumanAdapter extends Human implements Student {

    public HumanAdapter(String name, int age) {
        super(name, age);
    }

    public void showName() {
        printName();
    }

    public void showAge() {
        printAge();
    }
}

1-4. Mainクラス

メイン処理を実行するクラスである。

Main.java

package com.devkuma.designpattern.structural.adapter.ex1;

public class Main {
    public static void main(String[] args) {
        Student student = new HumanAdapter("devkuma", 25);
        student.showName();
        student.showAge();
    }
}

1-5. 実行結果

devkuma
25

2. 委譲を利用した方法

Adapter Pattern Class Diagram

2-1. Humanクラス

もともと提供されたクラスである。

Human.java

package com.devkuma.designpattern.structural.adapter.ex2;

public class Human {

    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printName() {
        System.out.println(name);
    }

    public void printAge() {
        System.out.println(age);
    }
}

2-2. Studentインターフェース

必要なインターフェースである。

Student.java

package com.devkuma.designpattern.structural.adapter.ex2;

public interface Student {
    void showName();

    void showAge();
}

2-3. HumanAdapterクラス

Adapter役となるクラスである。

HumanAdapter.java

package com.devkuma.designpattern.structural.adapter.ex2;

public class HumanAdapter implements Student {

    private Human human;

    public HumanAdapter(String name, int age) {
        this.human = new Human("田中", 25);;
    }

    public void showName() {
        human.printName();
    }

    public void showAge() {
        human.printAge();
    }
}

2-4. Mainクラス

メイン処理を実行するクラスである。

Main.java

package com.devkuma.designpattern.structural.adapter.ex2;

public class Main {
    public static void main(String[] args) {
        Student student = new HumanAdapter("devkuma", 25);
        student.showName();
        student.showAge();
    }
}

2-5. 実行結果

devkuma
25

Adapterパターンのメリット

Adapterパターンは、既存クラスに皮をかぶせ、必要なクラスを作る。このパターンを使うと、必要なメソッド群を素早く作ることができる。
もしバグが検出されたとしても、既存クラスが十分にテストされているなら、Adapter役のクラスを重点的に調査すればよくなるため、プログラムのチェックが楽になる。
また、Adapterパターンを使えば既存クラスに手を加えずに機能を実装できるため、既存クラスを再テストする手間を減らせる。