🫣

初心者のためのAdapterパターン入門

に公開

はじめに

ソフトウェア開発の世界では、互換性のないインターフェースを持つコンポーネント同士を連携させる必要がよく生じます。既存のコード変更せずに新しいインターフェースに適合させたい場合、よく使われるのがAdapterパターンです。

本記事では初心者向けにAdapterパターンの基本概念、メリット、実装方法について解説します。

Adapterパターンとは

Adapterパターンとは、既存のクラスにインターフェースを追加するために使用されるデザインパターンの一つです。このパターンでは、二つの異なるクラスを接続するためのAdapterクラスを定義します。Adapterクラスは、既存のクラスが新しいインターフェースをサポートできるように、新しいクラスに必要なインターフェースを提供します。

Adapterパターンの構成要素

Adapterパターンは主に以下の要素から成り立っています:

  1. Target:クライアントが使用したいインターフェース
  2. Adaptee:既存で互換性のないインターフェースを持つクラス
  3. Adapter:AdapteeのインターフェースをTargetのインターフェースに変換するクラス

なぜAdapterパターンが必要なのか

Adapterパターンが必要となる状況はいくつかあります:

  • 既存のクラスに対して新しいインターフェースを追加する場合
  • 既存のクラスと新しいクラスとの間に互換性を持たせる場合
  • 既存のクラスをライブラリやフレームワークに統合する場合

例えば:
既存のライブラリがあるが、そのライブラリを使用するためのインターフェースがアプリケーションにとって望ましくない場合、Adapterパターンを使用することでインターフェースを変換し、ライブラリを使用できるようにすることができます。

Adapterパターンのメリット

Adapterパターンには以下のようなメリットがあります:

  1. 既存のクラスの変更を最小限に抑えることができる
  2. 既存のクラスを再利用することができる
  3. 層を増やすことができ、一般に層を増やすと、変更に強くなり、保守性が高まります
  4. 互換性のない既存システムを新しいシステムに統合する場合に便利です

Adapterパターンの実装方法

Adapterパターンには、主に二つの実装方法があります:

1. 継承を利用した方法

継承を利用したAdapterは、利用したいクラスのサブクラスを作成し、そのサブクラスに対して必要なインターフェースを実装することで実現されます。元のクラスを継承してクラス単位でwrapします。

2. 委譲を利用した方法

こちらの方法では、Adapterクラスが内部でAdapteeのインスタンスを保持し、そのメソッドを呼び出すことで機能を実現します。

コード例

JavaでのAdapterパターンの簡単な実装例を見てみましょう

// Target
interface Print {
    printWeak(): void;
    printStrong(): void;
}

//Adaptee
class Banner {
    private string: string;

    constructor(string: string) {
        this.string = string;
    }

    public showWithParen(): void {

    }

    public showWithAster(): void {

    }
}

//Adapter
class PrintBanner extends Banner implements Print {
    constructor(string: string) {
        super(string);
    }

    printWeak(): void {
        this.showWithParen();
    }

    printStrong(): void {
        this.showWithAster();
    }
}

//クライアント
const p: Print = new PrintBanner("Hello");
p.printWeak();
p.printStrong();

この例では、Bannerが提供するshowWithParen()showWithAsterというメソッドを、Printインターフェースが定義するprintWeak()printStrong()というメソッドに適合させるために、PrintBannerクラスを使用しています。

実践的な応用例

Adapterパターンの実践的な使用例をいくつか紹介します:

  1. データ形式の変換:アプリケーションでデータをXML形式で出力する必要があり、既存のライブラリであるJSON形式で出力する関数が提供されている場合、Adapterパターンを使用してJSONをXMLに変換できます
  2. サードパーティ製品の統合: Excelをプログラムから操作するライブラリをプロジェクトで使う場合などに、Adapterパターンを使うことができます。サードパーティ製品とプロジェクトドメインのクラスとの間にAdapterを嚙ますことで、層を増やし、変更に強くすることができます。
  3. システム統合:ある企業が新しいシステムを開発し、既存のシステムにある顧客情報を新しいシステムに統合する必要がある場合、Adapterパターンを使用してAPIのレスポンスを新しいシステムが使用する形式に変換することができます。

まとめ

Adapterパターンは、互換性のないインターフェースを持つクラス同士を接続するための強力なツールです。既存のコードを変更せずに新しいインターフェースに適合させることができるため、コードの再利用性と保守性を高めることができます。
初心者の方は、まず身近な例として「電源アダプター」をイメージすると理解しやすいでしょう。異なる国のコンセント形状に対応するために電源アダプターを使用するように、Adapterパターンはソフトウェアの世界で異なるインターフェース同士を接続します。

Discussion