アダプター
公開日: 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やライブラリを流用できるため、保守性と移行性を同時に高めることができます。
「変えるのではなく、つなぐ」──その発想が求められるとき、アダプターは最も現実的な選択肢になります。