ao-log

インフラ系ITエンジニアのメモ帳です。

PythonでCommandパターンを実装する

Rubyによるデザインパターン』は、デザインパターンの使いどころや各パターンの意図を順を追って説明してくれるので、読みやすい良本でした。

Rubyによるデザインパターン

Rubyによるデザインパターン

数多くの操作を蓄え、それらを一気に実行させたい、といった処理をするときは、Command パターンが役に立つ一例となります。Python で実装すると以下のようになります。実行した処理を戻したい場合は、更に Undo 処理を実装することになります。

#!/usr/bin/env python

class Command():
    def execute():
        pass

class CompositeCommand(Command):
    def __init__(self):
        self.__cmd_list = []

    def append_cmd(self, cmd):
        self.__cmd_list.append(cmd)

    def execute(self):
        for cmd in self.__cmd_list:
            cmd.execute()

class FileTouchCommand(Command):
    def __init__(self, path):
        self.__path = path

    def execute(self):
        cmd = "touch %s" % (self.__path)
        print cmd

class ChmodCommand(Command):
    def __init__(self, path, permission):
        self.__path = path
        self.__permission = permission

    def execute(self):
        cmd = "chmod %s %s" % (self.__permission, self.__path)
        print cmd

if __name__ == "__main__":

    cc = CompositeCommand()

    # コマンドを組み立てる
    cc.append_cmd(FileTouchCommand("/tmp/test"))
    cc.append_cmd(ChmodCommand("/tmp/test", "600"))

    # 組み立てたコマンドを実行する
    cc.execute()