概要
アダプターパターンは、互換性のないインターフェースを持つクラス同士を接続するためのデザインパターンである。異なるインターフェースを持つオブジェクトを使いたい場合、アダプタークラスを介して既存のクラスを新しいインターフェースに適合させる。
利用目的
アダプターパターンは、既存のクラスを再利用しつつ、そのクラスのインターフェースを変更したい場合に使用される。例えば、新しいインターフェースに合わせて既存のクラスを使いたいが、元のクラスを直接変更したくない場合に有効である。特に、異なるライブラリや API を統合する際に便利である。
注意点
アダプターパターンは、既存のクラスに依存しているため、クラスの内部構造や動作に変化があった場合、アダプターも修正が必要になることがある。また、複雑なアダプターを作ると、設計が不必要に複雑になる場合があるため、単純な解決策で済むならばアダプターパターンを使用するべきではない。
実装
Target
// クライアントが使用するインターフェース
public interface Target {
void request();
}
Adaptee
// 既存のクラス。異なるインターフェースを持つ
public class Adaptee {
public void specificRequest() {
System.out.println("AdapteeのspecificRequestが呼び出された");
}
}
Adapter
// アダプタークラス。TargetインターフェースにAdapteeを適合させる
// 【注意】新インターフェースを implements する!
public class Adapter implements Target {
//【 既存のクラス Adaptee を所有する!】
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
// 【新インターフェースのメソッド内で既存クラスのメソッドを呼び出す!】
adaptee.specificRequest();
}
}
App
// Mainクラス
public class App {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target adapter = new Adapter(adaptee);
// クライアントはTargetインターフェースを通してアダプティのメソッドを使う
adapter.request();
}
}