Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

Pythonで学ぶデザインパターン[Adapter]

Icon in a callout block
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ケーブルで古いゲーム機をテレビに接続しました        

…ちょっとはわかった気がする。

Powered by Tomo with passion.