##概要
インタフェースに互換性の無いクラス同士を組み合わせるためのパターン
以下の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
##メリット
- 変更を加えるのが困難なクラスに手を入れずにクライアントがそれを利用できるようになる
- 複数のアダプターを用意することで、異なる互換性のないコンポーネントに対応ができるようになる
##まとめ
変更がしにくく、互換性のないクラスを組み合わせて利用する際に便利なパターン