Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

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

Icon in a callout block
Python 100Days Challenge Day20

Commandパターンについて学んでいく。

概要

  • 特定の操作(または命令)をオブジェクトとして表現するデザインパターン
  • 操作をオブジェクトとして扱うことで操作履歴を管理したり、操作をキューに入れて順番に実行できる

テレビのリモコンで考えてみる

  • リモコンの機能
    • 電源を入れる
    • 音量を上げる

これらはボタンで操作ができ、特定の命令をテレビに伝えることができる。

Commandパターンを使うと、このようなボタン操作をオブジェクトとして表現が可能となる。

基本構文

  • Commandインターフェース
    • 全てのコマンドが実装すべき共通のメソッドexecute を定義する
  • コマンドクラス
    • Commandインターフェースを実装し、特定の操作を実行するクラス
    • やりたいことを指示する役割
  • レシーバークラス
    • 実際に操作を行うクラス
  • インボーカークラス
    • コマンドを設定し、実行するクラス
    • コマンドクラスで指示されたやりたいことを実際に実行するクラス

実際にコードを書く

テレビのリモコンを操作するようなCommandパターンのコードを書いてみる

# Commandインターフェース
class Command:
    def execute(self):
        pass
        
# テレビの電源を入れるコマンドクラス
class TurnOnTVCommand(Command):
    def __init__(self, tv):
        self.tv = tv
        
    def execute(self):
        self.tv.turn_on()
        
# テレビの音量を上げるコマンドクラス
class IncreaseVolumeCommand(Command):
    def __init__(self, tv):
        self.tv = tv
        
    def execute(self):
        self.tv.increase_volume()
        
# レシーバー(実際に操作を行うTVクラス)
class TV:
    def turn_on(self):
        print("テレビがつきました!")
        
    def increase_volume(self):
        print("音量が上がりました!")

# インボーカー(コマンドを実行するリモコンクラス)
class RemoteControl:
    def set_command(self, command):
        self.command = command
        
    def press_button(self):
        self.command.execute()

# 実行例
tv = TV()
remote_control = RemoteControl()

# 電源を入れるコマンドを指定して実行する
turn_on_command = TurnOnTVCommand(tv)
remote_control.set_command(turn_on_command)
remote_control.press_button()

# 音量を上げるコマンドを指定して実行する
increase_volume_command = IncreaseVolumeCommand(tv)
remote_control.set_command(increase_volume_command)
remote_control.press_button()

コードの補足

  • Commandクラス
    • これは命令を表すクラス
    • executeメソッドを持っている(中身はまだない)
    • 「命令を実行するよ」という約束だけはしている
  • TurnOnTVCommandクラス
    • テレビの電源を入れる命令を表すクラス
    • tvを受け取り、self.tvに保存する
    • execureメソッドでself.tv.turn.on()を呼び出すことで、テレビの電源を入れてね、という命令を出す
  • IncreaseVolumeCommandクラス
    • IncreaseVolumeCommandクラスは、テレビの音量を上げる命令を表すクラス
    • tvを受け取り、self.tvに保存する
    • execureメソッドでself.tv.increase_volume()を呼び出すことで、テレビの音量を上げてね、という命令を出す
  • TVクラス
    • 名前の通りテレビを表すクラス
    • turn_onメソッドはテレビがつきました!と表示
    • increase_volumeメソッドは音量が上がりました!と表示
  • RemoteControlクラス
    • RemoteControlクラスはリモコンを表すクラス
    • set_commandメソッドでリモコンが実行する命令を設定
    • press_buttonメソッドで設定した命令を実行する
Powered by Tomo with passion.