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()