Ich möchte GoF-Entwurfsmuster in Python lernen.
Das Befehlsmuster (Englisch: Befehlsmuster) ist eines der Entwurfsmuster in der objektorientierten Programmierung und gibt ein Objekt an, das eine Aktion ausdrückt. Das Command-Objekt kapselt das Verhalten und die zugehörigen Parameter. Angenommen, die Druckbibliothek verfügt über eine PrintJob-Klasse. Der Bibliotheksbenutzer erstellt ein neues PrintJob-Objekt, legt die Parameter (zu druckende Dokumente, Anzahl der Kopien usw.) fest und ruft schließlich die Methode zum Senden des Auftrags an den Drucker auf.
UML class and sequence diagram UML class diagram (Das Obige ist aus Wikipedia zitiert)
Eigentlich möchte ich versuchen, ein Beispielprogramm auszuführen, das das Befehlsmuster verwendet, und das folgende Verhalten überprüfen.
--Erstellen Sie eine test1.txt
-Datei mit der Dateiberechtigung" 777 ".
--Erstellen Sie eine test2.txt
-Datei mit der Dateiberechtigung" 600 ".
Im Beispielprogramm ist das erste Argument der Dateiname, den Sie erstellen möchten, und das zweite Argument sind die Dateiberechtigungen, die Sie erteilen möchten.
$ python Main.py test1.txt 777
% touch test1.txt
% chmod 777 test1.txt
$ python Main.py test2.txt 600
% touch test2.txt
% chmod 600 test2.txt
Überprüfen Sie die Dateiliste.
$ ls -l|grep test
-rwxrwxrwx 1 ttsubo staff 0 1 26 13:01 test1.txt
-rw------- 1 ttsubo staff 0 1 26 13:01 test2.txt
Wie erwartet wurde die Datei generiert.
Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Command
--Verzeichnisaufbau
.
├── Main.py
└── command
└── command.py
Es ist die Rolle, die die Schnittstelle von Anweisungen bestimmt. Im Beispielprogramm übernimmt die Befehlsklasse diese Rolle.
command/command.py
from abc import ABCMeta, abstractmethod
class Command(metaclass=ABCMeta):
@abstractmethod
def execute(self):
pass
@abstractmethod
def display(self):
pass
Dies ist die Rolle, die die Schnittstelle für die Rolle "Befehl" tatsächlich implementiert. Im Beispielprogramm übernehmen die Klassen "FileTouchCommand" und "ChmodCommand" diese Rolle.
command/command.py
class FileTouchCommand(Command):
def __init__(self, filename, receiverObj):
self.__filename = filename
self.__receiver = receiverObj
def execute(self):
self.__receiver.createFile(self.__filename)
def display(self):
print("% touch {0}".format(self.__filename))
class ChmodCommand(Command):
def __init__(self, filename, permission, receiverObj):
self.__filename = filename
self.__permission = permission
self.__receiver = receiverObj
def execute(self):
self.__receiver.changeFileMode(self.__filename, self.__permission)
def display(self):
permission = format(self.__permission, 'o')
print("% chmod {0} {1}".format(permission, self.__filename))
Dies ist die Zielrolle, wenn der Befehl der Rolle "ConcreteCommand" ausgeführt wird. Sie können es den Empfänger der Bestellung nennen. Im Beispielprogramm übernimmt die Klasse "FileOperator" diese Rolle.
command/command.py
from pathlib import Path
...(snip)
class FileOperator(object):
def createFile(self, filename):
Path(filename).touch()
def changeFileMode(self, filename, permission):
Path(filename).chmod(permission)
Es ist die Rolle, die die Ausführung der Anweisung startet. Es ist die Rolle des Aufrufs der Schnittstelle, die durch die Rolle des Befehls definiert ist. Im Beispielprogramm übernimmt die Klasse "CompositeCommand" diese Rolle.
command/command.py
class CompositeCommand(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()
Dies ist die Rolle, die die Rolle "ConcreteCommand" erstellt und zu diesem Zeitpunkt die Empfängerrolle zuweist. Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.
Main.py
import sys
from command.command import FileOperator, CompositeCommand, FileTouchCommand, ChmodCommand
def startMain(filename, permission):
recv = FileOperator()
cc = CompositeCommand()
cc.append_cmd(FileTouchCommand(filename, recv))
cc.append_cmd(ChmodCommand(filename, permission, recv))
cc.execute()
cc.display()
if __name__ == "__main__":
startMain(sys.argv[1], int(sys.argv[2], 8))
Recommended Posts