Adapter Patternの基本概念
-
目的
異なるインターフェースを持つクラス同士を繋ぐための“アダプタ”を提供する。 -
いつ使うか
-
異なるインターフェースを持つクラスやシステムを統合する必要があるとき。 例えば、古いシステムのコードを新しいシステムに統合したいが、両方のシステムで使用されるメソッドやプロパティの名前や振る舞いが異なる場合など。
-
再利用を最大化したい場合。 既存のクラスやライブラリのコードを書き換えずに、新しい要件やインターフェースに合わせて再利用したいとき。
-
将来の変更を柔軟に対応したい場合。 新しいクラスやライブラリを追加する可能性がある場合、Adapter Patternを使用することで新旧のクラスを容易に統合できます。
アダプタパターンの主要な構成要素
Target: クライアントが利用したいインターフェースを定義します。
Adaptee: 既存のインターフェースで、アダプターによって新しいインターフェースに変換されるクラスです。
Adapter: Target インターフェースを実装し、Adaptee インスタンスを内部でラップします。Target インターフェースのメソッドを呼び出すと、内部で Adaptee のメソッドを呼び出します。
- PythonでのAdapter Pattern実装例
1.1 Adapteeの実装
既存のクラスや旧システムのコード。
class OldPrinter:
def show(self, text):
print(f"Old method: {text}")
1.2 Targetインターフェースの実装
新しいシステムや要件に基づくインターフェース。
class NewPrinterInterface:
def print_text(self, text):
print(f"New method: {text}")
1.3 Adapterの実装
既存のOldPrinterのshowメソッドを、新しいprint_textメソッドに適応させる。
class PrinterAdapter(NewPrinterInterface):
def __init__(self, old_printer):
self.old_printer = old_printer
def print_text(self, text):
# AdapterがOldPrinterのshowメソッドを呼び出しています
self.old_printer.show(text)
1.4 使用例
# Adapterを使ってOldPrinterの機能を使用
printer = PrinterAdapter(OldPrinter())
printer.print_text("Hello, Adapter!")
# NewPrinterInterfaceを直接使用
new_printer = NewPrinterInterface()
new_printer.print_text("Hello, New Interface!")
# Old method: Hello, Adapter!
# New method: Hello, New Interface!
Adapter Patternの制約
- システムの複雑さの増加
Adapterパターンを過度に使用すると、多くのアダプタクラスが導入される可能性がある。これにより、システム全体の複雑さや理解の難易度が増加するリスクがある。 - パフォーマンスへの影響
アダプタがデータ変換や追加の処理を行う場合、オーバーヘッドが発生し、パフォーマンスに悪影響を及ぼす可能性がある。特に、高頻度で呼び出される処理でアダプタを使用する場合は、この影響を慎重に評価する必要がある。