Adapter パターン(アダプター・パターン、英: Adapter pattern)は、ソフトウェア工学におけるデザインパターンの一つで、既存クラスを変更せずに、互換性のないインターフェースを接続可能にするため、あるインタフェースをクライアントが期待する別のインタフェースへ変換する設計手法である。実装形態には、継承を用いるクラスアダプタと、委譲(オブジェクト合成)を用いるオブジェクトアダプタがある。
継承を利用したAdapter 継承を利用したAdapterは、利用したいクラスのサブクラスを作成し、そのサブクラスに対して必要なインタフェースを実装することで実現される。
サンプルプログラム 下記の例において、Productクラスは既存のクラスであり修正できないものとする。 ここで、Productクラスを利用したい開発者がいて、 その開発者はgetPriceというメソッドでProductの値段を取得したいとする。 この場合、ProductAdapterというAdapterを作成することで、既存クラス(Product)クラスを修正することなく、 異なるインタフェースを持たせることができる。 このように、既存クラスを修正することなく、異なるインタフェースを持たせるということが、Adapter パターンの役割である。 interface ProductPrice{ public int getPrice(); }
class Product{ private int cost; public int getCost(){ return cost;
class ProductAdapter extends Product implements ProductPrice{ public int getPrice(){ return this.getCost();
クラス図 継承を利用したAdapterのクラス図は以下のようになる。
center|500px|Adapter は Adaptee を継承し、同時に Target を実装する。実装したメソッド Adapter#requiredMethod() 内で Adaptee#oldMethod() を実行する
参考までに、上のサンプルコードとこのクラス図との対応を示す。
TargetProductPrice Target#requiredMethodProductPrice#getPrice() AdapterProductAdapter Adapter#requiredMethodProductAdapter#getPrice() AdapteeProduct Adaptee#oldMethodProduct#getCost()
委譲を利用したAdapter 委譲を利用したAdapterは、利用したいクラスのインスタンスを生成し、そのインスタンスを他クラスから利用することで実現される。
サンプルプログラム interface ProductPrice{ public int getPrice(); }
class Product{ private int cost; public int getCost(){ return cost;
class ProductAdapter implements ProductPrice{ private Product product = new Product(); public int getPrice(){ return product.getCost();
クラス図 委譲を利用したAdapterのクラス図は以下のようになる。
center|500px|Adapter は Adaptee をメンバに持ち、同時に Target を実装する。実装したメソッド Adapter#requiredMethod() 内で、メンバの Adaptee#oldMethod() を実行する ※上図において、extendsはimplementsでも良い。
こちらのほうも、参考までにサンプルコードの対応を示す。
TargetProductPrice Target#requiredMethod()ProductPrice#getPrice() AdapterProductAdapter Adapter#requiredMethod()ProductAdapter#getPrice() AdapteeProduct Adaptee#oldMethod()Product#getCost()