[PYTHON] Entwurfsmuster # Template-Methode

Ich übte Designmuster, um Code zu schreiben, der sich des Designs bewusst war. Andere Entwurfsmuster werden häufig veröffentlicht.

Vorwort

Das Hauptziel ist zu verstehen, wann, was und wie Entwurfsmuster verwendet werden. (Ich bin neu in Java oder einer statisch typisierten Sprache und habe keine lange Geschichte mit Python. Ich denke, es gibt einige Dinge, die Pythonista nicht ähneln. Wenn Sie Vorschläge haben, bringen Sie mir dies bitte bei.)

Diesmal bezog sich die Vorlagenmethode des Musters auf das Verhalten.

Was ist die Vorlagenmethode?

Ein Entwurfsmuster, in dem die Oberklasse das Verarbeitungsframework und die Unterklasse den spezifischen Inhalt definiert. Ist es? Mit anderen Worten, da der Algorithmus durch die Vorlagenmethode der Superklasse beschrieben wird, ist es nicht erforderlich, den Algorithmus einzeln auf der Unterklassenseite zu beschreiben. Wenn dann die Programmierung mit dem Muster der Vorlagenmethode durchgeführt wird, ist es möglich, die Probleme der nachfolgenden Korrektur zu verringern, bei der nur die Vorlagenmethode korrigiert werden muss, selbst wenn ein Fehler in der Vorlagenmethode gefunden wird.

Mit anderen Worten, der grobe Algorithmus sollte im Voraus von der Oberklasse festgelegt werden, und das konkrete Design und die Verarbeitung des Algorithmus sollten von der Unterklasse vorgenommen werden.

Überblick

Das hier erstellte Beispielprogramm zeigt "Zeichen und Zeichenfolgen an, die fünfmal wiederholt wurden". Hier besteht es aus drei Klassen: AbstractDisplay, CharDisplay und StringDisplay sowie Main (Ausführungsdatei). Die Anzeigemethode ist in der AbstractDisplay-Klasse definiert. Bei der Anzeigemethode werden drei Methoden verwendet: Öffnen, Drucken und Schließen. Diese drei Methoden werden auch in der AbstractDisplay-Klasse deklariert, sind jedoch immaterielle abstrakte Methoden. Hier ist die Anzeigemethode, die eine abstrakte Methode verwendet, die Vorlagenmethode. Die tatsächlichen Implementierungen der Methoden open, print und close sind die Klassen CharDisplay und StringDisplay, die Unterklassen der Klasse AbstractDisplay sind. Es gibt eine Abbildung unten.

abstract_display.py


from abc import ABCMeta, abstractmethod

class AbstractDisplay(metaclass=ABCMeta):
    @abstractmethod 
    def opening(self):
        pass

    @abstractmethod     
    def printing(self):
        pass
        
    @abstractmethod 
    def closing(self):
        pass
    
    def display(self):
        self.opening()
        for i in range(5):
            self.printing()
        self.closing()

char_display.py


import sys
from abstract_display import AbstractDisplay

class CharDisplay(AbstractDisply):
    def __init__(self, ch):
        self.__ch  = ch
    
    def opening(self):
        sys.stdout.write('<<') #Wenn Sie print verwenden, wird unmittelbar nach der Ausgabe ein leeres Zeichen angezeigt.
    def printing(self):
        sys.stdout.write(self.__ch)
    
    def closing(self):
        print('>>')   

char_display.py


import sys
from abstract_display import AbstractDisplay

class StringDisplay(AbstractDisplay):
    def __init__(self, string):
        self.__string = string
        self.__width = len(string)
    
    def opening(self):
        self.__print_line()

    def printing(self):
        self.print('|' + self.__string + '|')
     
    def closing(self):
        self.__print_line() 

    def __print_line(self):
        sys.stdout.write(''.join(('+', '-' * self.__width, '+\n')))  #Wenn Sie print verwenden, wird unmittelbar nach der Ausgabe ein leeres Zeichen angezeigt.

main.py


from char_display import CharDisplay
from string_display import StringDisplay


def main():
    d1 = CharDisplay('H')
    d2 = StringDisplay('Hello, World')
    d3 = StringDisplay('Hallo')
    
    d1.display()
    d2.display()
    d3.display()

if __name__ == '__main__':
    main()

python main.py

<<HHHHH>>
+------------+
|Hello, World|
|Hello, World|
|Hello, World|
|Hello, World|
|Hello, World|
+------------+
+-----+
|Hallo|
|Hallo|
|Hallo|
|Hallo|
|Hallo|
+-----+

Welche Bedeutung haben abstrakte Klassen?

Der tatsächliche Verarbeitungsinhalt kann nur von Unterklassen verstanden werden, es scheint jedoch wichtig, den Verarbeitungsfluss in der abstrakten Klassenphase zu gestalten. Wenn es eine abstrakte Klasse gibt, implementiert die Unterklasse die Methoden, die in der abstrakten Klasse enthalten sind. Machen Sie dann die Unterklasse für die Implementierung der Methode verantwortlich.

Zusammenfassung

Abstrakte Klassen können nicht instanziiert werden. Ich habe mich gefragt, wofür die Klasse existiert, beispielsweise für eine Klasse, die keine Instanz erstellen kann, aber da der Hauptteil der Methode nicht in der abstrakten Methode geschrieben ist, kenne ich den spezifischen Verarbeitungsinhalt nicht. Es ist jedoch möglich, den Namen der Methode zu bestimmen und den Prozess durch die Vorlagenmethode unter Verwendung dieser Methode zu beschreiben, und durch Standardisierung des Prozesses können die Möglichkeit von Korrekturen und Fehlern verringert werden.

Das Entwurfsmuster lautet [Trennung von Interesse](http://ja.wikipedia.org/wiki/%E9%96%A2%E5%BF%83%E3%81%AE%E5%88%86%E9%9B% Ich denke, dass A2) die Basis ist.

Referenz

Recommended Posts

Entwurfsmuster # Template-Methode
Python Design Pattern - Template-Methode
Entwurfsmuster #Factory-Methode
[Detaillierte Erklärung] Muster der Vorlagenmethode
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Muster der Vorlagenmethode in Java
[Viererbande] Design Pattern Learning - Template-Methode
Entwurfsmuster #Builder
Entwurfsmuster #Adapter
Entwurfsmuster #Decorator
Entwurfsmuster #Observer
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
[Viererbande] Designmuster lernen - Fabrikmethode
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Ich habe ein Designmuster in der Kotlin Template Edition geschrieben
Oreore-Entwurfsmuster: Glokale Variable
[Viererbande] Designmuster lernen
Einführung einer datengesteuerten Controller-Entwurfsmethode
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Grobe Zusammenfassung des GoF-Java-Entwurfsmusters
Vorlage
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
[Viererbande] Design Pattern Learning - Singleton
[Viererbande] Design Pattern Learning --Decorator
[Viererbande] Designmuster lernen --Besucher
[Viererbande] Design Pattern Learning - Vermittler
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Befehl" in Python
[Viererbande] Designmusterlernen --Iterator
GoF-Entwurfsmuster aus dem Problem 2. Struktur
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
[Viererbande] Designmuster lernen - Fassade
[Viererbande] Design Pattern Learning - Composite
[Viererbande] Designmuster lernen - Prototyp
GoF-Entwurfsmuster aus dem Problem 1. Generation
Lernen Sie das Entwurfsmuster "Iterator" mit Python
[Viererbande] Designmuster lernen - Andenken
[Viererbande] Designmuster lernen - Staat
[Vierergruppe] Design Pattern Learning - Interpreter
[Viererbande] Design Pattern Learning - Builder
Lernen Sie das Entwurfsmuster "Strategie" mit Python
[Viererbande] Designmuster lernen - Brücke
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
[Viererbande] Designmuster lernen --Adapter
Lernen Sie das Designmuster "Facade" mit Python
[Viererbande] Design Pattern Learning - Beobachter
[Viererbande] Designmuster lernen - Befehl
GoF-Entwurfsmuster aus dem Problem 3. Verhalten