[GO] Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python

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.

■ Vorlagenmethode (Muster der Vorlagenmethode)

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 templatemethod.png (Das Obige wird aus Wikipedia zitiert)

■ Beispielprogramm "Vorlagenmethode"

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!|
+-------------+

■ Details zum Beispielprogramm

Ä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

(1) Die Rolle von AbstractClass

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()

(2) Die Rolle von ConcreteClass

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('+')

(3) Die Rolle des Kunden (Benutzers)

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()

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Befehl" in Python
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Lernen Sie das Entwurfsmuster "Iterator" mit Python
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
Python Design Pattern - Template-Methode
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Entwurfsmuster # Template-Methode
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Designmuster "Facade" mit Python
Muster der Vorlagenmethode in Java
Implementieren Sie das Singleton-Muster in Python
Singleton-Muster in Python
Entwurfsmuster #Factory-Methode
Besuchermuster in Python
[Detaillierte Erklärung] Muster der Vorlagenmethode
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Dynamisches Ersetzen der nächsten Methode in Python
Simplex-Methode (Einzelmethode) in Python
Private Methode in Python
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
[Viererbande] Design Pattern Learning - Template-Methode
Bestimmen Sie den Schwellenwert mithilfe der P-Tile-Methode in Python
Implementierte k-Neighborhood-Methode in Python von Scikit Learn
Ich habe ein Designmuster in der Kotlin Template Edition geschrieben
Finde Fehler in Python
Entwurfsmuster in Python: Einführung
Das Unterdrücken von Methodenüberschreibungen in Python
Verwendung der Methode __call__ in der Python-Klasse
Abrufen der arXiv-API in Python
Python im Browser: Brythons Empfehlung
Speichern Sie die Binärdatei in Python
Klicken Sie in Python auf die Sesami-API
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Skriptpfad in Python
Im Python-Befehl zeigt Python auf Python3.8
Implementierte Methode zur Weitergabe von Etiketten in Python
Simulieren Sie die Monte-Carlo-Methode in Python
Klicken Sie auf die Web-API in Python
Hash-Methode (Open-Address-Methode) in Python
Ich habe die Warteschlange in Python geschrieben
Berechnen Sie den Vormonat in Python