Adapter
1. 目的
- 既存コンポーネントを別(システム|ライブラリ)のインターフェイスに適合させたい
2. 課題
- 既存コンポーネントを別(システム|ライブラリ)のインターフェイスに適合させたいが、その為に既存コンポーネントを改修したくない
3. 解決策
- 既存コンポーネントを内包した新コンポーネントを作成する
- 以下のようなコンポーネントが存在するとする
class MyComponent:
def __init__(self, value):
self.value = value
def exec():
return self.value
- このコンポーネントを以下のインターフェイスに適合させたい
class Target(metaclass=ABCMeta):
@abstractmethod
def target_method():
pass
- そこで、
Target
インターフェイスを実装したクラス内にMyComponent
のインスタンスを持ち、処理をMyComponent
に委譲する
class Adapter(Target):
def __init__(self, value):
self.component = MyComponent(value)
def target_method():
return self.component.exec()
- このようにAdapter内部で既存コンポーネントに処理を委譲することで既存コンポーネントを変更せず、任意のインターフェイスに対応することが可能になる
4. メリット
- 既存コンポーネントを変更することなく、別(システム|ライブラリ)のインターフェイスに適合させることができる
5. デメリット
6. 注意事項
継承によるAdapterは原則として避ける
- 本稿では移譲を用いたAdapterパターンの実装について述べたが、継承を用いても同じ目的を達成することができる
- ただし、継承はモジュール間の依存関係が強固になり過ぎる為、保守性の観点で問題が起こりやすい
- その為、Adapterパターンの実装は原則として移譲を用いるべきである