Adapter パターン

「Adapter」という英単語は、「適合させるもの」という意味です。

互換性のないインタフェースを持つメソッド間の相違を、埋めるような(適合させる)パターンが、「Adapter パターン」です。つまり、「Adapter パターン」は、ある任意の機能のインタフェースを変更することなく、他クラスが提供している新しい機能を使用できるようにするパターンです。


このパターンには、以下の2つの実装方法があります。

  1. 継承(is a 関係)を利用した方法
  2. 委譲(has a 関係)を利用した方法

役割り

1. Client(利用者)
「Target」のメソッドを利用して処理を行います。
2. Target(対象)
要求されているメソッド(インタフェース)を定めます。
3. Adaptee(適合される側)
既存のメソッドを提供します。このメソッドの機能を「Target」のインタフェースに適合させ利用します。
4. Adapter(適合させる)
「Adaptee」のメソッドのインタフェースを吸収し、「Target」から利用できるインタフェースに変換します。実装方法としては、以下の2通りあります。
・「Target」が interface で定義されている場合
「Adaptee」を継承する方法(1.継承を利用した方法)で実装します。
・「Target」が「abstract class」で定義されている場合
「Adaptee」に委譲する方法(2.委譲を利用した方法)で実装します。

▲PageTop

クラス図

Adapterパターンのクラス図


1.継承(is a 関係)を利用した方法

Adapterパターン クラス図

2.委譲(has a 関係)を利用した方法

Adapterパターン クラス図

▲PageTop

サンプル

ソースコード

■1.継承(is a 関係)を利用した方法 ・・・「Target」がインタフェースとして提供されている場合

1. Client.java

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

2. Target.java

public interface Target {
    public abstract void targetMethod1();
    public abstract void targetMethod2();
}

3. Adaptee.java

public class Adaptee {
    public void method1(){
        System.out.println("method1");
    }
    public void method2(){
        System.out.println("method2");
    }
}

4. Adapter.java

public class Adapter extends Adaptee implements Target {
    public void targetMethod1(){
        method1();
    }
    public void targetMethod2(){
        method2();
    }
}

■2.委譲(has a 関係)を利用した方法 ・・・「Target」が抽象クラスとして提供されている場合

1. Client.java(「1.継承」と同様)

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

2. Target.java

public abstract class Target {
    public abstract void targetMethod1();
    public abstract void targetMethod2();
}

3. Adaptee.java(「1.継承」と同様)

public class Adaptee {
    public void method1(){
        System.out.println("method1");
    }
    public void method2(){
        System.out.println("method2");
    }
}

4. Adapter.java

public class Adapter extends Target {
    private Adaptee adaptee;

    public Adapter(){
      this.adaptee = new Adaptee();
      }
    public void targetMethod1(){
    adaptee.method1();
    }
    public void targetMethod2(){
    adaptee.method2();
    }
    }

実行結果

1.継承を利用した方法

C:\sample\desin_pattern\adapter1>javac Client.java [Enter]

C:\sample\desin_pattern\adapter1>java Client [Enter]
method1
method2
        

2.委譲を利用した方法

C:\sample\desin_pattern\adapter2>javac Client.java [Enter]

C:\sample\desin_pattern\adapter2>java Client [Enter]
method1
method2
        

▲PageTop