デザインパターン学習メモ:「Adapter」


このパターンの目的

GoF本より引用する。

 あるクラスのインタフェースを、クライアントが求める他のインタフェースに変換する。Adapterパターンは、インタフェースに互換性のないクラス同士を組み合わせることができるようにする。(P.149)

このパターンによって、すでに存在するクラスを任意のインタフェースに適合させることができる。

実装例

『アジャイルソフトウェア開発の奥義』(P.404) を参考に作成。

Light.java
// 自由に改変できないサードパーティ製ライブラリに含まれるクラスとする
// Adapteeの役割
public class Light {
    public void on() {
        // 何らかの実装
    }

    public void off() {
        // 何らかの実装
    }
}
Switchable.java
// 開発中のプロジェクトで要求されるインタフェース
// Targetの役割
public interface Switchable {
    void turnOn();
    void turnOff();
}
LightAdapter.java
// Adapterの役割
public class LightAdapter implements Switchable {

    private Light light;

    public LightAdapter(Light light) {
        this.light = light;
    }

    @Override
    public void turnOn() {
        light.on();
    }

    @Override
    public void turnOff() {
        light.off();
    }

使用するシーン

開発中のプロジェクトにおいて、Switchableインタフェースを用いてポリモーフィズムに則った動作を行うとしているとする。

サードパーティ製ライブラリにLightクラスを見つけ、ほしい機能が揃っていたのでぜひこれを使いたいが、このクラスはもちろんSwitchableインタフェースを実装していない。

そのようなときに、LightAdapterクラスを作成し、SwitchableのインタフェースからLightクラスの機能を呼び出すことで、望み通りのインタフェースとLightクラスの機能が手に入る。

2種類のAdapter

オブジェクトに適用するAdapterパターン

  • 実装例で示したもの
  • AdapterがAdapteeのオブジェクトをクラス内部に持ち、必要な処理を委譲する

クラスに適用するAdapterパターン

  • 多重継承を用いて、TargetとAdapteeを継承するAdapterクラスを作成する
  • 多重継承を認めるC++などで使用可能

Javaでは「オブジェクトに適用するAdapterパターン」を使うことになるだろう。
それぞれの利点については、GoF本を参照してほしい。

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ
  • ロバート・C・マーチン(2004)『アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技』瀬谷啓介訳、SBクリエイティブ