Ich übte Designmuster, um Code zu schreiben, der sich des Designs bewusst war. Andere Entwurfsmuster werden häufig veröffentlicht.
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.
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.
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|
+-----+
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.
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.
Recommended Posts