[GO] Lernen Sie das Entwurfsmuster "Bridge" mit 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.

■ Brücke (Brückenmuster)

Das Brückenmuster (Brückenmuster) ist eines der von GoF (Gang of Four; 4 Banden) definierten Entwurfsmuster. Der Zweck besteht darin, die Klasse in mehrere Richtungen zu erweitern, indem eine "Brücken" -Klasse vorbereitet wird.

UML class and sequence diagram W3sDesign_Bridge_Design_Pattern_UML.jpg UML class diagram bridge.png (Das Obige wird aus Wikipedia zitiert)

□ Memorandum

Das Bridge-Muster scheint die ** Feature-Class-Hierarchie ** und die ** Implementierungsklassen-Hierarchie ** zu überbrücken.

(1) Wie ist die Funktionsklassenhierarchie?

Wenn Sie einer Klasse neue Funktionen hinzufügen möchten, definieren Sie eine neue Unterklasse und implementieren Sie die Methode. Die Beziehung zwischen einer vorhandenen Oberklasse und einer neu definierten Unterklasse ist die "Funktionsklassenhierarchie". Nehmen Sie im Allgemeinen die folgenden Beziehungen an.

(2) Wie ist die Hierarchie der Implementierungsklassen?

Wenn Sie eine neue Implementierung hinzufügen möchten, definieren Sie eine konkrete Unterklasse, die von der abstrakten Klasse abgeleitet ist, und implementieren Sie dann die Methode. Die Beziehung zwischen einer vorhandenen abstrakten Klasse und einer neu abgeleiteten konkreten Unterklasse ist die "Klassenhierarchie der Implementierung". Nehmen Sie im Allgemeinen die folgenden Beziehungen an.

■ Beispielprogramm "Bridge"

Ich möchte tatsächlich ein Beispielprogramm ausführen, das das Bridge-Muster verwendet, und das folgende Verhalten überprüfen. Dies ist ein Beispiel, das eine Brücke zwischen der ** Funktionsklassenhierarchie ** und der ** Implementierungsklassenhierarchie ** voraussetzt.

$ python Main.py 
+-----------+
|Hello Japan|
+-----------+

+-----------+
|Hello Japan|
+-----------+

+--------------+
|Hello Universe|
+--------------+

+--------------+
|Hello Universe|
|Hello Universe|
|Hello Universe|
|Hello Universe|
|Hello Universe|
+--------------+

+--------------+
|Hello Universe|
|Hello Universe|
|Hello Universe|
|Hello Universe|
+--------------+

aaa
bbb
ccc
ddd
eee
fff
ggg

Wenn Sie nur das Beispielprogramm ausführen, wissen Sie nicht wirklich, was Sie tun möchten. Als nächstes überprüfen wir die Details des Beispielprogramms.

■ Details zum Beispielprogramm

Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Bridge

--Verzeichnisaufbau

.
├── Main.py
├── bridge
│   ├── __init__.py
│   ├── function
│   │   ├── __init__.py
│   │   ├── display_count_func.py
│   │   ├── display_func.py
│   │   └── display_random_func.py
│   └── implement
│       ├── __init__.py
│       ├── display_impl.py
│       ├── display_string_impl.py
│       └── display_textfile_impl.py
└── test.txt

(1) Die Rolle der Abstraktion

Es ist eine Klasse, die nur grundlegende Funktionen mit der Methode "Implementieren" implementiert. Im Beispielprogramm übernimmt die Klasse "DisplayFunc" diese Rolle.

bridge/function/display_func.py


class DisplayFunc(object):
    def __init__(self, impl):
        self.impl = impl

    def open(self):
        self.impl.rawOpen()

    def print_body(self):
        self.impl.rawPrint()

    def close(self):
        self.impl.rawClose()

    def display(self):
        self.open()
        self.print_body()
        self.close()

(2) Die Rolle der verfeinerten Abstraktion

Dies ist eine Rolle mit zusätzlichen Funktionen zur Rolle "Abstraktion". Im Beispielprogramm übernehmen die Klasse "DisplayCountFunc" und die Klasse "DisplayRandomFunc" diese Rolle.

bridge/function/display_count_func.py


from bridge.function.display_func import DisplayFunc

class DisplayCountFunc(DisplayFunc):
    def __init__(self, impl):
        super(DisplayCountFunc, self).__init__(impl)

    def multiDisplay(self, times):
        self.open()
        for _ in range(times):
            self.print_body()
        self.close()

bridge/function/display_random_func.py


import random
from bridge.function.display_func import DisplayFunc

class DisplayRandomFunc(DisplayFunc):
    def __init__(self, impl):
        super(DisplayRandomFunc, self).__init__(impl)

    def randomDisplay(self, times):
        self.open()
        t = random.randint(0, times)
        for _ in range(t):
            self.print_body()
        self.close()

(3) Die Rolle des Implementierers

Diese Rolle definiert eine Methode zum Implementieren der Schnittstelle der Rolle "Abstraktion". Im Beispielprogramm übernimmt die Klasse "DisplayImpl" diese Rolle.

bridge/implement/display_impl.py


from abc import ABCMeta, abstractmethod

class DisplayImpl(metaclass=ABCMeta):
    @abstractmethod
    def rawOpen(self):
        pass

    @abstractmethod
    def rawPrint(self):
        pass

    @abstractmethod
    def rawClose(self):
        pass

(4) Die Rolle des konkreten Implementierers

Insbesondere ist es die Rolle der Implementierung der Schnittstelle der Rolle "Implementieren". Im Beispielprogramm übernehmen die Klasse "DisplayStringImpl" und die Klasse "DisplayTextfileImpl" diese Rolle.

bridge/implement/display_string_impl.py


from bridge.implement.display_impl import DisplayImpl

class DisplayStringImpl(DisplayImpl):
    def __init__(self, string):
        self.string = string
        self.width = len(string)

    def rawOpen(self):
        self.printLine()

    def rawPrint(self):
        print("|{0}|".format(self.string))

    def rawClose(self):
        self.printLine()
        print("")

    def printLine(self):
        line = '-' * self.width
        print("+{0}+".format(line))

bridge/implement/display_textfile_impl.py


from bridge.implement.display_impl import DisplayImpl

class DisplayTextfileImpl(DisplayImpl):
    def __init__(self, filename):
        self.filename = filename

    def rawOpen(self):
        filename = self.filename
        self.f = open(filename, "r")

    def rawPrint(self):
        data = self.f.read()
        data = data.split('\n')
        for l in data:
            print(l)

    def rawClose(self):
        self.f.close()

(5) Die Rolle des Kunden

Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.

Main.py


from bridge.function.display_func import DisplayFunc
from bridge.function.display_count_func import DisplayCountFunc
from bridge.function.display_random_func import DisplayRandomFunc
from bridge.implement.display_string_impl import DisplayStringImpl
from bridge.implement.display_textfile_impl import DisplayTextfileImpl

def startMain():
    d1 = DisplayFunc(DisplayStringImpl("Hello Japan"))
    d2 = DisplayCountFunc(DisplayStringImpl("Hello Japan"))
    d3 = DisplayCountFunc(DisplayStringImpl("Hello Universe"))
    d4 = DisplayRandomFunc(DisplayStringImpl("Hello Universe"))
    d5 = DisplayFunc(DisplayTextfileImpl("test.txt"))
    d1.display()
    d2.display()
    d3.display()
    d3.multiDisplay(5)
    d4.randomDisplay(5)
    d5.display()

if __name__ == '__main__':
    startMain()

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Designmuster "Flyweight" 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 "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
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Designmuster "Facade" mit Python
Implementieren Sie das Singleton-Muster in Python
Singleton-Muster in Python
Besuchermuster in Python
Finde Fehler in Python
Entwurfsmuster in Python: Einführung
Python Design Pattern - Template-Methode
Abrufen der arXiv-API in Python
Python im Browser: Brythons Empfehlung
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
Klicken Sie auf die Web-API in Python
Ich habe die Warteschlange in Python geschrieben
Berechnen Sie den Vormonat in Python
Untersuchen Sie die Klasse eines Objekts mit Python
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Hostnamen in Python
Greifen Sie mit Python auf die Twitter-API zu
Der erste Schritt von Python Matplotlib
Ich habe den Stack in Python geschrieben
Beherrsche das schwache Ref-Modul in Python
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Laden Sie das Remote-Python-SDK mit IntelliJ
Versuchen Sie es mit der Wunderlist-API in Python
[Python Kivy] Über das Ändern des Designthemas
Versuchen Sie, die Kraken-API mit Python zu verwenden
Lernen Sie die Grundlagen, während Sie Python-Variablen berühren
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Nehmen Sie die logische Summe von List in Python (Zip-Funktion)
Zeigen Sie Python 3 im Browser mit MAMP an
Tweet mit der Twitter-API in Python
Überprüfen Sie, ob die URL in Python vorhanden ist
Ordnen Sie die in pythons models.py festgelegte Tabelle zu
Führen Sie den Python-Interpreter im Skript aus
Das Ergebnis der Installation von Python auf Anaconda
Was ist "Mahjong" in der Python-Bibliothek? ??
Lesen Sie die Datei Zeile für Zeile mit Python