[PYTHON] Entwurfsmuster #Adapter

Ich habe Designmuster geübt, 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 der Musteradapter auf die Struktur.

Was ist ein Adapter?

Es gibt die folgenden zwei Arten von Adaptermustern.

  1. Adaptermuster nach Klasse (unter Verwendung der Vererbung)
  2. Adaptermuster nach Instanz (unter Verwendung der Delegierung)

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.

Überblick

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.

Vererbungsmuster-Klassendiagramm

Adapter継承

Vererbungsmuster des Adapters

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.

Adapterdelegierungsmuster

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.

Klassendiagramm des Delegierungsmusters

Adapter 委譲

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*

Zusammenfassung

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.

Referenz

Recommended Posts

Entwurfsmuster #Adapter
Entwurfsmuster #Builder
Entwurfsmuster #Decorator
Entwurfsmuster #Observer
Entwurfsmuster #Facade
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
Lernen Sie das Entwurfsmuster "Adapter" mit Python
[Viererbande] Designmuster lernen --Adapter
Entwurfsmuster #Factory-Methode
Entwurfsmuster # Template-Methode
Ich habe ein Designmuster in der Kotlin Adapter Edition geschrieben
Oreore-Entwurfsmuster: Glokale Variable
Python Design Pattern - Template-Methode
[Viererbande] Designmuster lernen
Grobe Zusammenfassung des GoF-Java-Entwurfsmusters
Lernen Sie das Entwurfsmuster "Builder" mit Python
[Viererbande] Design Pattern Learning --Decorator
[Viererbande] Designmuster lernen --Besucher
Design Muster-Adapter
[Viererbande] Design Pattern Learning - Vermittler
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
[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
Design Muster-Iterator
[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
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
Lernen Sie das Designmuster "Facade" mit Python
[Viererbande] Design Pattern Learning - Beobachter
[Viererbande] Designmuster lernen - Befehl
GoF-Entwurfsmuster aus dem Problem 3. Verhalten
[Viererbande] Designmuster lernen - Fluggewicht
[Viererbande] Designmusterlernen - Abstract Factory
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
[Viererbande] Designmuster lernen - Fabrikmethode
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben