オブジェクトをラップし、別のインタフェースを提供します。
※ アダプタ、デコレータ、ファサードパターンの違い
アダプタは、オブジェクトのインタフェースを変更するためにラップします。
デコレータは、新しい振舞いや責務を追加するためにラップします
ファサードは、簡素化のために一連オブジェクトを「ラップ」します
HeadFirstデザインパターンでの定義
クラスのインタフェースをクライアントが期待する別のインタフェースに変換します。 アダプタは、互換性のないインタフェースのためにそのままでは連携できないクラスを連携させまます。
構成要素
Client : Tragetインタフェースを利用する処理
Target : 変換時に実装したいインタフェース
Adapter : TargetクラスのインタフェースをAdapteeクラスの処理利用して実装します
Adaptee : インタフェースの変換を行う元クラス
真鴨クラスを七面鳥クラスとして扱いたい場合
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck {
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
public interface Turkey {
public void gobble();
public void fly();
}
public class DuckAdapter implements Turkey {
Duck duck;
Random rand;
public DuckAdapter(Duck duck) {
this.duck = duck;
rand = new Random();
}
public void gobble() {
duck.quack();
}
public void fly() {
if (rand.nextInt(5) == 0) {
duck.fly();
}
}
}
public class Client {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
Turkey duckAdapter = new DuckAdapter(duck);
for(int i=0;i<10;i++) {
System.out.println("The DuckAdapter says...");
duckAdapter.gobble();
duckAdapter.fly();
}
}
}