GoFのデザインパターン「Command」をpythonで書くときのためのテンプレートです。
command
└─command.py
main.py
command.py
from abc import ABCMeta, abstractmethod
#命令のインタフェース(API)を定義する役。
class Command(metaclass=ABCMeta):
@abstractmethod
def execute(self):
pass
@abstractmethod
def display(self):
pass
#ConcreteCommand役の命令を実行するときに対象となる役。つまり、命令の受け取り手。例:複合機
class Receiver(object):
def DoSomething1(self, arg1):
print("{0}引数を指定して、DoSomething1コマンドを受領。".format(arg1))
def DoSomething2(self, arg1, arg2):
print("{0}と{1}引数を指定して、DoSomething2コマンドを受領。".format(arg1,arg2))
#Invokerは命令の実行を開始する役です。Command役で定義されているインタフェースを呼び出す役。例:印刷キュー
#コマンドをリストに格納することで、コマンドの実行履歴を管理できる。
class Invoker(Command):
def __init__(self):
self.__cmds = []
def append_cmd(self, cmd):
self.__cmds.append(cmd)
def execute(self):
for cmd in self.__cmds:
cmd.execute()
def display(self):
for cmd in self.__cmds:
cmd.display()
#Command役のインタフェースを実際に実装している役です。(ConcreteCommand1とConcreteCommand2) 例:印刷対象書類
class ConcreteCommand1(Command):
def __init__(self, arg1, receiverObj):
self.__arg1 = arg1
self.__receiver = receiverObj
def execute(self):
self.__receiver.DoSomething1(self.__arg1)
def display(self):
print("実効内容 {0}".format(self.__arg1))
class ConcreteCommand2(Command):
def __init__(self, arg1, arg2, receiverObj):
self.__arg1 = arg1
self.__arg2 = arg2
self.__receiver = receiverObj
def execute(self):
self.__receiver.DoSomething2(self.__arg1, self.__arg2)
def display(self):
arg2 = format(self.__arg2)
print("実効内容 {0} {1}".format(arg2, self.__arg1))
main.py
import sys
from command.command import Receiver, Invoker, ConcreteCommand1, ConcreteCommand2
def startMain(arg1, arg2):
recv = Receiver()
inv = Invoker()
inv.append_cmd(ConcreteCommand1(arg1, recv))
inv.append_cmd(ConcreteCommand2(arg1, arg2, recv))
inv.execute()
inv.display()
if __name__ == "__main__":
startMain(sys.argv[1], sys.argv[2])