Categories
デザインパターン

Adapter パターン

概要

アダプターパターン(Adapter Pattern)は、ソフトウェア設計パターンの一つです。このパターンは、互換性のないインターフェースを持つクラス同士を連携させるための方法を提供します。アダプターパターンは、既存のクラスを変更せずに、そのクラスを他のクラスやシステムと連携させるために使用されます。

アダプターパターンでは、以下の要素が関与します:

  1. ターゲット(Target):互換性のあるインターフェースを定義します。クライアントが利用するための統一されたメソッドを提供します。
  2. アダプティー(Adaptee):連携させたい既存のクラスやシステムを表します。互換性のないインターフェースを持っており、直接はターゲットと連携できません。
  3. アダプター(Adapter):ターゲットインターフェースを実装し、アダプティーをラップするクラスです。アダプタークラスはターゲットのインターフェースメソッドを実装し、その内部でアダプティーのメソッドを呼び出して処理を行います。

アダプターパターンは、以下のような状況で使用されます:

  • 既存のクラスやシステムを変更することなく、別のインターフェースと連携させる必要がある場合。
  • クライアントが特定のインターフェースを期待しているが、提供されるのは異なるインターフェースのオブジェクトの場合。

アダプターパターンにより、既存のクラスやシステムとの互換性を確保し、コードの再利用性や保守性を向上させることができます。

コード例

以下は、C++でのアダプターパターンのコード例です。この例では、既存のLegacyRectangleクラスをアダプターを介して新しいRectangleクラスに連携させます。

#include <iostream>

// 既存のクラス
class LegacyRectangle {
public:
    void draw(int x1, int y1, int x2, int y2) {
        std::cout << "LegacyRectangle: draw with points (" << x1 << "," << y1 << ") and (" << x2 << "," << y2 << ")" << std::endl;
    }
};

// ターゲットインターフェース
class Rectangle {
public:
    virtual void draw(int x, int y, int width, int height) = 0;
};

// アダプタークラス
class LegacyRectangleAdapter : public Rectangle {
private:
    LegacyRectangle* legacyRectangle;

public:
    LegacyRectangleAdapter(LegacyRectangle* legacyRectangle) : legacyRectangle(legacyRectangle) {}

    void draw(int x, int y, int width, int height) override {
        int x1 = x;
        int y1 = y;
        int x2 = x + width;
        int y2 = y + height;
        legacyRectangle->draw(x1, y1, x2, y2);
    }
};

int main() {
    // 既存のクラスのインスタンス
    LegacyRectangle legacyRectangle;

    // アダプターを介した新しいクラスのインスタンス
    Rectangle* rectangle = new LegacyRectangleAdapter(&legacyRectangle);

    // 新しいクラスのメソッドを呼び出す
    rectangle->draw(10, 20, 100, 200);

    delete rectangle;

    return 0;
}

このコードでは、LegacyRectangleクラスが既存のクラスを表し、Rectangleクラスがターゲットインターフェースを表します。LegacyRectangleAdapterクラスはアダプターとして機能し、LegacyRectangleをラップしてRectangleのインターフェースを実装します。

LegacyRectangleAdapterクラスのdrawメソッドでは、与えられた座標と幅・高さを基に適切なパラメータを計算し、LegacyRectangledrawメソッドを呼び出します。

main関数では、LegacyRectangleクラスのインスタンスを作成し、アダプターを介したRectangleクラスのインスタンスを使用してメソッドを呼び出しています。ここで、LegacyRectangleのメソッドが呼び出されることにより、既存のクラスと新しいクラスが連携されます。

このように、アダプターパターンを使用することで、既存のクラスやシステムを新しいインターフェースと連携させることができます。