Topiqlo ロゴ

アダプター

公開日: 2025/06/02

アダプターパターンとは?──異なるインターフェースをつなぐ柔軟な変換機構

はじめに

新しいモジュールを導入しようとしたら、「期待していたインターフェースと合わない」──こんな経験はありませんか?
アダプターパターン(Adapter Pattern)は、互換性のないインターフェース同士を“変換してつなぐ”ための設計パターンです。
本記事では、アダプターの構造、用途、実装例、ファサードやデコレーターとの違いも交えて解説します。

基本情報・概要

アダプターパターンとは、既存のクラスやライブラリのインターフェースを、別のインターフェースに変換することで互換性をもたせる構造です。
「橋渡し役」「変換層」とも呼ばれ、再実装せずに流用するために活用されます。

主な目的:

  • 互換性のないAPI同士を接続
  • 既存コードを変更せずに再利用
  • 外部ライブラリを自前コードに適合させる

比較・分類・特徴の表形式まとめ(任意)

パターン主な用途
Adapter互換性のないインターフェースを変換して接続
Facade(ファサード)複雑なAPI群をまとめて、単純なAPIとして提供
Decorator振る舞いを動的に追加(同一インターフェース)

アダプターは「“使えるようにする”ことが主目的の変換機構」です。

深掘り解説

✅ JavaScriptによる基本例

// 既存のクラス(そのままでは使いにくい)
class OldPrinter {
  printText(text) {
    console.log(`[旧印刷機] ${text}`);
  }
}

// 新しいインターフェースを期待するコード
class App {
  constructor(printer) {
    this.printer = printer;
  }

  run() {
    this.printer.print("Hello Adapter");
  }
}

// アダプター:旧クラスを新しいインターフェースに変換
class PrinterAdapter {
  constructor(oldPrinter) {
    this.oldPrinter = oldPrinter;
  }

  print(text) {
    this.oldPrinter.printText(text);
  }
}

const legacyPrinter = new OldPrinter();
const adapter = new PrinterAdapter(legacyPrinter);
const app = new App(adapter);
app.run();  // => [旧印刷機] Hello Adapter
  • PrinterAdapter
    が「変換レイヤー」として機能
  • クライアント(
    App
    )は
    print()
    しか知らず、
    printText()
    に依存しない

アダプターは既存資産を“そのまま使えるように”整えるパターンです。

応用・発展的な使い方

  • 外部APIとの整合:REST仕様やライブラリのAPIを内部フォーマットに変換
  • DBラッパー実装:SQL系のドライバを共通インターフェースで扱う
  • React/Vueへのレガシー連携:旧JSコードをAdapterでUIコンポーネントに適合
  • 型変換層として利用(TypeScript):データモデルの整形やフォーマット修正

アダプターは“変更せずに変換する”という現実的な設計ニーズに応える武器です。

よくある誤解と注意点(任意)

  • 「Adapter=コード再構成の手段」ではない:既存クラスを触らず使うのが本質
  • Adapterの増加はメンテナンス負荷になる:共通インターフェースを意識する設計が重要
  • 似て非なるFacade/Decoratorと混同しやすい:それぞれ目的と構造が異なる
  • 変換コストが高くなる場合も:変換処理が複雑すぎないか検討が必要

アダプターは**“接続と互換”のための最小限の抽象化**を提供する存在です。

まとめ

アダプターパターンは、異なるインターフェース同士を変換して結びつけるための柔軟な設計パターンです。
自前コードを変えずに既存APIやライブラリを流用できるため、保守性と移行性を同時に高めることができます。
「変えるのではなく、つなぐ」──その発想が求められるとき、アダプターは最も現実的な選択肢になります。