「Adapter」という英単語は、「適合させるもの」という意味です。
互換性のないインタフェースを持つメソッド間の相違を、埋めるような(適合させる)パターンが、「Adapter パターン」です。つまり、「Adapter パターン」は、ある任意の機能のインタフェースを変更することなく、他クラスが提供している新しい機能を使用できるようにするパターンです。
このパターンには、以下の2つの実装方法があります。
Adapterパターンのクラス図
■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