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

■ Beobachtermuster (Beobachtermuster)

Das Observer-Muster ist eine Art Entwurfsmuster, das beim Benachrichtigen anderer Objekte über Ereignisse (Ereignisse) eines Objekts im Programm verwendet wird. Dies wird aufgerufen, weil die zu benachrichtigende Objektseite von der zu benachrichtigenden Objektseite beobachtet wird (Englisch: beobachten). Wird auch als Publishing-Abonnement-Modell bezeichnet. Es ist eng mit dem Prinzip des impliziten Aufrufs verbunden. Es wird auch verwendet, um ein verteiltes Ereignisverarbeitungssystem zu implementieren. Abhängig von der Sprache werden die in diesem Muster behandelten Probleme von der Ereignisbehandlungssyntax der Sprache behandelt.

UML class and sequence diagram W3sDesign_Observer_Design_Pattern_UML.jpg UML class diagram 2880px-Observer_w_update.svg.png

(Das Obige ist aus Wikipedia zitiert)

□ Memorandum

Wenn sich im "Beobachter" -Muster der Zustand des Beobachtungsziels ändert, wird der Beobachter benachrichtigt, so dass es bei der Beschreibung der Verarbeitung gemäß der Zustandsänderung wirksam zu sein scheint. Die ursprüngliche Bedeutung des Wortes "Beobachter" ist "Beobachter", aber in Wirklichkeit ist die Rolle des "Beobachters" nicht aktiv "beobachten", sondern wird passiv durch die Rolle des "Subjekts" "benachrichtigt". Es wird gesagt, dass es manchmal als "Publish-Subscribe" -Muster bezeichnet wird, weil es auf Sie wartet. Natürlich fand ich die Ausdrücke "veröffentlichen" und "abonnieren" angemessener.

■ Beispielprogramm "Observer"

Ich möchte tatsächlich ein Beispielprogramm ausführen, das das Observer-Muster verwendet, und das folgende Verhalten überprüfen.

――Der Beobachter beobachtet das Objekt, das viele Zahlen generiert, und zeigt den Wert an. ――Die Anzeigemethode unterscheidet sich je nach Beobachter. --DigitalObserver zeigt den Wert numerisch an --GraphicObserver zeigt die Werte in einem einfachen Diagramm an

$ python Main.py 
DigitObservser: 30
GraphicObserver:******************************
DigitObservser: 48
GraphicObserver:************************************************
DigitObservser: 6
GraphicObserver:******
DigitObservser: 19
GraphicObserver:*******************
DigitObservser: 19
GraphicObserver:*******************
DigitObservser: 45
GraphicObserver:*********************************************
DigitObservser: 8
GraphicObserver:********
DigitObservser: 21
GraphicObserver:*********************
DigitObservser: 40
GraphicObserver:****************************************
DigitObservser: 6
GraphicObserver:******
DigitObservser: 1
GraphicObserver:*
DigitObservser: 9
GraphicObserver:*********
DigitObservser: 26
GraphicObserver:**************************
DigitObservser: 22
GraphicObserver:**********************
DigitObservser: 16
GraphicObserver:****************
DigitObservser: 10
GraphicObserver:**********
DigitObservser: 45
GraphicObserver:*********************************************
DigitObservser: 1
GraphicObserver:*
DigitObservser: 36
GraphicObserver:************************************
DigitObservser: 45
GraphicObserver:*********************************************

■ Details zum Beispielprogramm

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

--Verzeichnisaufbau

.
├── Main.py
└── observer
    ├── __init__.py
    ├── generator.py
    └── observer.py

(1) Rolle des Subjekts

Die Rolle "Subjekt" repräsentiert die "beobachtete Seite". Die Rolle "Subjekt" verfügt über eine Methode zum Registrieren der Beobachterrolle "Beobachter" und eine Methode zum Löschen. Außerdem wird eine Methode zum Abrufen des aktuellen Status deklariert. Im Beispielprogramm übernimmt die Klasse "NumberGenerator" diese Rolle.

observer/generator.py


import random
from abc import ABCMeta, abstractmethod

class NumberGenerator(metaclass=ABCMeta):
    def __init__(self):
        self.__observers = []

    def addObserver(self, observer):
        self.__observers.append(observer)

    def deleteObserver(self, observer):
        self.__observers.remove(observer)

    def notifyObserver(self):
        for o in self.__observers:
            o.update(self)

    @abstractmethod
    def getNumber(self):
        pass

    @abstractmethod
    def execute(self):
        pass

(2) Die Rolle des konkreten Subjekts

Die Rolle "Konkretes Subjekt" ist eine Rolle, die eine konkrete "beobachtete Seite" ausdrückt. Wenn sich der Status ändert, teilen Sie dies der registrierten "Beobachter" -Rolle mit. Im Beispielprogramm übernimmt die Klasse "RandomNumberGenerator" diese Rolle.

observer/generator.py


class RandomNumberGenerator(NumberGenerator):
    def __init__(self):
        self.__number = 0
        super(RandomNumberGenerator, self).__init__()

    def getNumber(self):
        return self.__number

    def execute(self):
        for _ in range(20):
            self.__number = random.randint(0, 49)
            self.notifyObserver()

(3) Die Rolle des Beobachters (Beobachter)

Die Rolle des "Beobachters" ist die Rolle, durch die Rolle des "Subjekts" gesagt zu werden, dass "der Staat sich verändert hat". Die Methode dafür ist "Update". Im Beispielprogramm übernimmt die Klasse "Observer" diese Rolle.

observer/observer.py


import time
from abc import ABCMeta, abstractmethod

class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(self, ganerator):
        pass

(4) Die Rolle von ConcreteObserver (konkreter Beobachter)

Die Rolle von "ConcreteObserver" ist ein konkreter "Beobachter". Wenn die Methode "update" aufgerufen wird, wird der aktuelle Status der Rolle "Subject" in dieser Methode abgerufen. Im Beispielprogramm übernehmen die Klassen "DigitObserver" und "GraphObserver" diese Rolle.

observer/observer.py


class DigitObserver(Observer):
    def update(self, generator):
        print("DigitObservser: {0}".format(generator.getNumber()))
        time.sleep(0.1)


class GraphObserver(Observer):
    def update(self, generator):
        print("GraphicObserver:", end='')
        count = generator.getNumber()
        for _ in range(count):
            print('*', end='')
        print("")
        time.sleep(0.1)

(5) Die Rolle des Kunden

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

Main.py


from observer.observer import  DigitObserver, GraphObserver
from observer.generator import RandomNumberGenerator

def startMain():
    generator = RandomNumberGenerator()
    observer1 = DigitObserver()
    observer2 = GraphObserver()
    generator.addObserver(observer1)
    generator.addObserver(observer2)
    generator.execute()

if __name__ == '__main__':
    startMain()

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "Observer" in 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 "Bridge" 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
Entwurfsmuster #Observer
Singleton-Muster in Python
Beobachtermuster in Java
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
Speichern Sie die Binärdatei in Python
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)
GoF-Entwurfsmuster aus dem Problem 2. Struktur
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