Ich habe Designmuster geübt, 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 der Musteradapter auf die Struktur.
Es gibt die folgenden zwei Arten von Adaptermustern.
Erstellen Sie eine Konvertierungsstruktur zwischen den beiden Klassen und konvertieren Sie sie, damit sie für einen anderen Zweck verwendet werden kann. Apdater ist die Rolle der mittleren Ebene, und diejenigen, die es verwenden, und diejenigen, die es verwenden, müssen den Inhalt nicht kennen. Der Punkt ist der Unterschied zwischen der Rückgabe als Klasse und der Rückgabe als Instanz.
Vererbung nach Klasse Es gibt ein Beispielprogramm mit dem Apache-Muster und ein Beispielprogramm nach Delegation. Beide zeigen die angegebene Zeichenfolge als (Zeichenfolge) oder \ * Zeichenfolge \ * an.
Die Banner-Klasse verfügt über eine Methode namens show_with_paren, die die Zeichenfolge in Klammern anzeigt, und eine Methode namens show_with_paren, die die Zeichenfolge mit \ * Markierungen davor und danach anzeigt. Angenommen, die Banner-Klasse ist vorhanden.
Die Druckschnittstelle deklariert eine Methode print_weak, um eine Zeichenfolge schwach (in Klammern) anzuzeigen, und eine Methode print_strong, um eine Zeichenfolge stark anzuzeigen.
Die PrinterBanner-Klasse spielt die Rolle eines Adapters. Diese Klasse erbt von der bereitgestellten Banner-Klasse und implementiert die erforderliche Druckerschnittstelle. Die PrinterBanner-Klasse fungiert jetzt als Adapter.
banner.py
class Banner():
def __init__(self, string):
self.__string = string
def show_with_paren(self):
print('({0})').format(self.__string))
def show_with_aster(self):
print('({0})').format(self.__string))
printer.py
from abc import ABCMeta, abstractmethod
class Printer(metaclass=ABCMeta):
@abstractmethod
def print_weak(self):
pass
@abstractmethod
def print_strong(self):
pass
printer_banner.py
from banner import Banner
class PrinterBanner(Banner)
def __init__(self, string):
super().__init__(string)
def print_weak(self):
self.show_with_paren()
def print_strong(self):
self.show_with_aster()
Die PrintBanner-Klasse fungiert als Adapter.
Erben Sie die Banner-Klasse und erben Sie die Methoden show_with_paren und show_with_aster.
Darüber hinaus werden die Methoden print_weak und print_strong mit der erforderlichen Druckerschnittstelle implementiert.
main.py
from printer_banner import PrinterBanner
if __name__ == '__main__':
pb = PrinterBanner('Bye')
pb.print_weak()
pb.print_strong()
Ausgabe mit print_weak () und print_strong () über die Druckerschnittstelle. Da main nicht weiß, um welche Art von Implementierung es sich bei der PrinterBanner-Klasse handelt, kann die Implementierung der PrinterBanner-Klasse geändert werden, ohne die Hauptklasse zu ändern.
Das Beispielprogramm nach Delegierung hat das gleiche Vererbungsmuster für Main und Banner. Der einzige Unterschied ist die PrintBanner-Klasse. Mit anderen Worten, verwenden Sie die Banner-Klasse, um eine Klasse zu realisieren, die dieselben Methoden wie die Printer-Klasse hat.
Die PrinterBanner-Klasse enthält eine Instanz der Banner-Klasse im Banner-Feld. Diese Instanz wird vom Konstruktor der PrinterBanner-Klasse erstellt. Dann werden in den Methoden print_weak und print_strong die Methoden show_with_paren und show_with_aster über das Bannerfeld aufgerufen.
Wenn Sie die Vererbung verwenden, rufen Sie die Methoden show_with_paren und show_with_aster auf, die von Ihrer Oberklasse geerbt wurden. Im Delegierungsmuster rufen Sie sie jedoch über Felder auf.
Wenn die print_weak-Methode der PrinterBanner-Klasse aufgerufen wird, bleibt sie der show_with_paren-Methode einer anderen Instanz (Banners Instanz) überlassen, anstatt sie selbst zu behandeln. Dies ist die Delegation.
printer_banner.py
from printer import Printer
from banner import Banner
class PrinterBanner(Printer):
def __init__(self, string):
self.__banner = Banner(string)
def print_weak(self):
self.banner.show_with_paren()
def print_strong(self):
self.banner.show_with_aster()
Dieses Mal erbt es von der Druckerklasse und ruft zuerst eine Instanz der Banner-Klasse auf.
Die Methoden print_weak und print_strong werden mit den Methoden show_with_paren und show_with_aster für die aufgerufene Instanz implementiert.
Nur der Wortlaut wird geändert, aber das Ausgabeergebnis ist das gleiche.
inheritance/main.py
(Bye)
*Bye*
delegation/main.py
(Hello)
*Hello*
Das Adaptermuster deckt die vorhandene Klasse ab und erstellt die erforderliche Klasse. Mit anderen Worten, der Schnittstellenteil wird dazwischen eingefügt, um die Lücke zwischen den beiden verschiedenen Parteien auszugleichen.
Selbst wenn es einen Fehler gibt, wissen wir, dass die vorhandene Klasse keinen Fehler aufweist. Daher sollten wir uns auf die Klasse konzentrieren, die die Rolle des Adapters spielt, was das Überprüfen des Programms sehr einfach macht, und auf die vorhandene Klasse Wenn Sie nur die Spezifikationen kennen, können Sie eine neue Klasse erstellen.
Recommended Posts