デザインパターン ~Adapter~


1. はじめに

GoFのデザインパターンにおける、Adapterパターンについてまとめます。

2. Adapterパターンとは

  • Adapterという英単語は、適合させるものという意味になります。
  • Adapterパターンは、既に提供されているがそのまま使えないものに対し、必要な形に変換して利用するための方式です。
  • 継承を利用した方法と委譲を利用した方法があります。
  • Wrapperパターンと呼ばれることもあります。Wrapperは包むものという意味になります。
  • GoFのデザインパターンでは、構造に関するデザインパターンに分類されます。

3. サンプルクラス図

3-1. ~継承を利用した方法~

3-2. ~委譲を利用した方法~

4. サンプルプログラム

生徒の名前と年齢を表示するプログラムです。

4-1. ~継承を利用した方法~

4-1-1. Humanクラス

元々提供されているクラスです。

Human.java
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);
    }
}

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

必要とされているインターフェースです。

Student.java
public interface Student {
    public abstract void showName();
    public abstract void showAge();
}

4-1-3. HumanAdapterクラス

Adapter役となるクラスです。

HumanAdapter.java
public class HumanAdapter extends Human implements Student {

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

    public void showName() {
        printName();
    }

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

4-1-4. Mainクラス

メイン処理を行うクラスです。

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

4-1-5. 実行結果

田中
25

4-2. ~委譲を利用した方法~

4-2-1. Humanクラス

元々提供されているクラスです。

Human.java
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);
    }
}

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

必要とされているインターフェースです。

Student.java
public interface Student {
    public abstract void showName();
    public abstract void showAge();
}

4-2-3. HumanAdapterクラス

Adapter役となるクラスです。

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

4-2-4. Mainクラス

メイン処理を行うクラスです。

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

4-2-5. 実行結果

田中
25

5. メリット

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

6. GitHub

7. デザインパターン一覧

8. 参考

今回の記事、及びサンプルプログラムは、以下の書籍を元に作成させて頂きました。

大変分かりやすく、勉強になりました。感謝申し上げます。
デザインパターンやサンプルプログラムについての説明が詳細に書かれていますので、是非書籍の方もご覧ください。