Als Material zum Erlernen von GoF-Entwurfsmustern scheint das Buch "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" hilfreich zu sein. Da die aufgeführten Beispiele jedoch auf JAVA basieren, habe ich dieselbe Vorgehensweise mit Python versucht, um mein Verständnis zu vertiefen.
Das Muster der Vorlagenmethode ist eines der von GoF (Gang of Four; 4 Banden) definierten Entwurfsmuster. Es gehört zu "Verhaltensmuster". Der Zweck des Template-Methodenmusters besteht darin, einen groben Algorithmus für einen Prozess vorzugeben und das spezifische Design dieses Algorithmus einer Unterklasse zu überlassen. Daher wird es häufig als Mittel zum Erstellen eines Systemframeworks verwendet.
UML class diagram (Das Obige wird aus Wikipedia zitiert)
Eigentlich möchte ich ein Beispielprogramm ausführen, das das Muster der Vorlagenmethode verwendet, und das folgende Verhalten überprüfen.
$ python Main.py
<<HHHHH>>
+-------------+
|Hello, World!|
|Hello, World!|
|Hello, World!|
|Hello, World!|
|Hello, World!|
+-------------+
Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/TemplateMethod
--Verzeichnisaufbau
.
├── Main.py
└── templatemethod
├── __init__.py
└── display.py
Die Rolle "AbstractClass" implementiert die Vorlagenmethode. Deklarieren Sie außerdem die in der Vorlagenmethode verwendete abstrakte Methode. Diese abstrakte Methode wird von der Unterklasse "ConcreteClass" implementiert. Im Beispielprogramm übernimmt die Klasse "AbstractDisplay" diese Rolle.
templatemethod/display.py
from abc import ABCMeta, abstractmethod
class AbstractDisplay(metaclass=ABCMeta):
@abstractmethod
def print(self):
pass
@abstractmethod
def open(self):
pass
@abstractmethod
def close(self):
pass
def display(self):
self.open()
for _ in range(5):
self.print()
self.close()
Implementieren Sie konkret die abstrakte Klasse, die durch die Rolle "AbstractClass" definiert ist. Die hier implementierte Methode wird von der Template-Methode aufgerufen, die die Rolle von "AbstractClass" spielt. Im Beispielprogramm übernehmen die Klassen "CharDisplay" und "StringDisplay" diese Rolle.
templatemethod/display.py
class CharDisplay(AbstractDisplay):
def __init__(self, ch):
self.__ch = ch
def open(self):
print('<<', end='')
def print(self):
print(self.__ch, end='')
def close(self):
print('>>')
class StringDisplay(AbstractDisplay):
def __init__(self, string):
self.__string = string
self.__width = len(string)
def open(self):
self.__printLine()
def print(self):
print("|{0}|".format(self.__string))
def close(self):
self.__printLine()
def __printLine(self):
print('+', end='')
for _ in range(self.__width):
print('-', end='')
print('+')
Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.
Main.py
from templatemethod.display import CharDisplay, StringDisplay
def startMain():
d1 = CharDisplay('H')
d2 = StringDisplay("Hello, World!")
d1.display()
print("")
d2.display()
if __name__ == '__main__':
startMain()
Recommended Posts