概要
インタフェースに互換性の無いクラス同士を組み合わせるためのパターン
以下の4種類のクラスからなる
- Targetクラス(2.が利用するためのインターフェイスを定義)
- Clientクラス(1.のインターフェイスにしたがう)
- Adapteeクラス(適合させる必要のある既存のインターフェイスを持つ)
- Adapterクラス(3.のインターフェイスを1.のインターフェイスに適合させる)
具体例と実装
描画ソフトとOSを例にすると
上記1~4はそれぞれ
- 描画ソフトクラス
- ユーザークラス
- Windows描画クラス
- OS依存機能共通化クラス
が対応する。
コードの詳細は以下
drawing_software.rb
class DrawingSoftware
  def initialize(drawing_object)
    @drawting_object = drawing_object
  end
  def draw
    # 描画オブジェクトを描画する
    @drawing_object.draw
  end
end
user.rb
  drawing_softrware = DrawingSoftware.new(WindowsAdapter.new(drawing_object))
  drawing_software.draw
windows_drawer.rb
class WindowsDrawer
  def initialize(drawing_object)
    @drawing_object = drawing_object
  end
  def sketch
    # 描画オブジェクトの下絵を描く
    @drawing_object.sketch
  end
  def paint
    # 描画オブジェクトの下絵を仕上げ描画を完成させる
    @drawing_object.paint
  end
end
windows_adapter.rb
class WindowsAdapter
  def initialize(drawing_object)
    @drawer = WindowsDrawer.new(drawing_object)
  end
  def draw
    @drawer.sketch
    @drawer.paint
  end
end
メリット
- 変更を加えるのが困難なクラスに手を入れずにクライアントがそれを利用できるようになる
- 複数のアダプターを用意することで、異なる互換性のないコンポーネントに対応ができるようになる
まとめ
変更がしにくく、互換性のないクラスを組み合わせて利用する際に便利なパターン