Python 100Days Challenge Day17
Pythonでアダプターパターンについて学んでいく。
概要
- アダプターパターン
- とあるクラスの機能を別のクラスで使えるようにするための「変換アダプター」を作る方法
- 既存のクラスを変えずに、インターフェース(クラスの使い方を指す)を別のインターフェースに変換するデザインパターン
- とあるクラスの機能を別のクラスで使えるようにするための「変換アダプター」を作る方法
たとえば、テレビと古いゲーム機があるとする。テレビにはHDMI端子はあるものの、古いゲーム機にはAV端子しかない。
これらは直接繋ぐことはできないけど、AV端子をHDMI端子に変換できれば古いゲーム機をテレビで使えるようになる。
これがアダプターパターンのベースとなる考え方。変換アダプター。
インターフェース:どんな操作ができるか
インターフェースという言葉がたくさん出てくるので、念のため説明すると「どんな操作ができるか」を定義したもの。
例えば、ゲーム機のコントローラーにおけるボタンやスティックは「どんな操作ができるか」機能があらかじめ定義されている。Bボタンを押したらキャラがダッシュする。スティックを操作するとキャラが歩く、など。これがインターフェースの概念。
基本構文
アダプターパターンの基本構造はこれ。
- Client:新しいインターフェースを使う部分
- Target:新しいインターフェース
- Adapter:新旧インターフェースの互換部分
- Adaptee:古いインターフェースを指す
では、実際に古いゲーム機をテレビに接続する、というプログラムを書いてみる
かくこーど
- OldGameConsole:古いゲーム機クラスで、AVケーブルで接続する方法を持っている
- HDTV:新しいテレビクラスで、HDMIで接続する方法を持っている
- GameConsoleAdapter:アダプタークラスで、古いゲーム機を新しいテレビに接続できるようにする
- このクラスは古いゲーム機のAVケーブル接続をHDMI接続に変換する役割を持っている
- connect_game_console_to_tv:HDMI接続を使ってゲーム機をテレビに接続する
# 古いゲーム機:Adaptee
class OldGameConsole:
def connect_with_av_cable(self):
return "接続:AVケーブルで古いゲーム機をテレビに接続しました"
# 新しいテレビ:target
class HDTV:
def connect_with_hdmi(self):
return "接続:HDMIでテレビに接続しました"
# アダプター:Adapter
class GameConsoleAdapter:
def __init__(self, old_console):
self.old_console = old_console
def connect_with_hdmi(self):
# AVケーブル接続をHDMI接続に変換する
return self.old_console.connect_with_av_cable()
# クライアント:Client
def connect_game_console_to_tv(console):
print(console.connect_with_hdmi())
# 古いゲーム機を新しいテレビに接続する
old_console = OldGameConsole()
adapter = GameConsoleAdapter(old_console)
# アダプターを使って接続
connect_game_console_to_tv(adapter)
>
接続:AVケーブルで古いゲーム機をテレビに接続しました
…ちょっとはわかった気がする。