[GO] Lernen Sie das Entwurfsmuster "State" in Python

Ich möchte GoF-Entwurfsmuster in Python lernen.

■ Zustand (Zustandsmuster)

Das Zustandsmuster ist eine Art Verhaltensentwurfsmuster, das bei der Programmierung verwendet wird. Dieses Muster wird verwendet, um den Zustand eines Objekts darzustellen. Es ist eine saubere Möglichkeit, mit Objekten zu arbeiten, deren Typ zur Laufzeit teilweise geändert wird.

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

□ Memorandum

Im "State" -Muster scheint das Ding "State" von einer Klasse ausgedrückt zu werden. Hier ist es möglich, das zustandsabhängige Verhalten mit der Rolle "ConcreteState" zu teilen. Bei Verwendung des "State" -Musters sollte jedoch beachtet werden, dass ** wer den State Transition verwalten soll **. (Wenn Sie den Zustandsübergang auf die Rolle von "ConcreteState" verlassen, wird die Abhängigkeit zwischen Klassen vertieft.)

■ Beispielprogramm "State"

Eigentlich möchte ich ein Beispielprogramm ausführen, das das Statusmuster verwendet, und das folgende Verhalten überprüfen. Stellen Sie sich hier "Visualisierung des Startstatus durch Betrieb eines Computers" </ font> vor.

  • Wenn Sie Ihren Computer starten, wird der Betriebsstatus "ausgeführt".
  • Wenn Sie den Computer anhalten, wird der Betriebsstatus "Herunterfahren".
  • Wenn Sie Ihren Computer neu starten, ändert sich der Betriebsstatus in "Wird ausgeführt".

Geben Sie im Beispielprogramm ** erstes Argument: erste Computeroperation **, ** zweites Argument: zweite Computeroperation ** an.

(Fall 1) Starten und stoppen Sie den Computer

Der Betriebszustand wird zuerst durch Starten auf dem Computer "ausgeführt" und dann durch Stoppen des Computers "heruntergefahren".

$ python Main.py start stop
###PC,[start]Machen
***Der Computer läuft
###Der Personal Computer[running]Ist jetzt in Betrieb

... sleep 5 second

###PC,[stop]Machen
***Der Computer ist gestoppt
###Der Betriebsstatus des PCs[shutdown]wurde

(Fall 2) Starten Sie den Computer und starten Sie ihn neu

Der Betriebszustand wird beim Starten des Computers zuerst "ausgeführt" und beim Neustart des Computers erneut "ausgeführt".

$ python Main.py start restart
###PC,[start]Machen
***Der Computer läuft
###Der Personal Computer[running]Ist jetzt in Betrieb

... sleep 5 second

###PC,[restart]Machen
***Der Computer wird neu gestartet
***Der Computer läuft
###Der Betriebsstatus des PCs[running]wurde

Das Beispielprogramm funktionierte wie erwartet.

■ Details zum Beispielprogramm

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

--Verzeichnisaufbau

.
├── Main.py
└── state
    ├── __init__.py
    ├── context.py
    └── state.py

(1) Die Rolle des Staates

Die Rolle "Staat" dient der Vertretung eines Staates. Definiert eine Schnittstelle, die sich für jeden Status unterschiedlich verhält. Im Beispielprogramm übernimmt die Klasse "State" diese Rolle.

state/state.py


from abc import ABCMeta, abstractmethod

class State(metaclass=ABCMeta):
    @abstractmethod
    def handle(self):
        pass

(2) Die Rolle von ConcreteState

Die Rolle "ConcreteState" repräsentiert einen bestimmten Einzelzustand. Implementieren Sie konkret die durch die Rolle "Staat" definierte Schnittstelle. Im Beispielprogramm

  • Klasse "ConcreteStateBooting"
  • Klasse "ConcreteStateRun"
  • Klasse "ConcreteStateShutDown"
  • Klasse "ConcreteStateRestart"

Ich werde diese Rolle jedoch ausprobieren.

state/state.py


class ConcreteState(State):
    def __init__(self, state):
        self.state = state
    
    def getConcreateState(self):
        return self.state


class ConcreteStateBooting(ConcreteState):
    def __init__(self, state):
        super(ConcreteStateBooting, self).__init__(state)

    def handle(self, context):
        print("***Der Computer läuft")
        context.setState(ConcreteStateRun("running"))


class ConcreteStateRun(ConcreteState):
    def __init__(self, state):
        super(ConcreteStateRun, self).__init__(state)

    def handle(self, context):
        print("***Der Computer ist in Betrieb")


class ConcreteStateShutDown(ConcreteState):
    def __init__(self, state):
        super(ConcreteStateShutDown, self).__init__(state)

    def handle(self, context):
        print("***Der Computer ist gestoppt")


class ConcreteStateRestart(ConcreteState):
    def __init__(self, state):
        super(ConcreteStateRestart, self).__init__(state)

    def handle(self, context):
        print("***Der Computer wird neu gestartet")
        context.setState(ConcreteStateBooting("booting"))
        context.handle()

(3) Rolle des Kontexts (Zustand, Kontext, Kontext)

Die Rolle "Kontext" enthält ein Objekt der Rolle "ConcreteState", das den aktuellen Status darstellt. Im Beispielprogramm übernimmt die Klasse "Kontext" diese Rolle.

state/context.py


class Context(object):
    def __init__(self, stateObj):
        self.state = stateObj

    def setState(self, obj):
        self.state = obj
    
    def handle(self):
        self.state.handle(self)

    def getState(self):
        return self.state.getConcreateState()

(4) Die Rolle des Kunden

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

Main.py


import sys
import time
from state.context import Context
from state.state import ConcreteStateBooting, ConcreteStateRun, ConcreteStateShutDown, ConcreteStateRestart


def setConcreteState(operation):
    if operation == "start":
        return ConcreteStateBooting("booting")
    elif operation == "stop":
        return ConcreteStateShutDown("shutdown")
    elif operation == "restart":
        return ConcreteStateRestart("restart")

def startMain(initial_operation, change_operation):
    obj = Context(setConcreteState(initial_operation))
    print("###PC,[{0}]Machen".format(initial_operation))
    obj.handle()
    print("###Der Personal Computer[{0}]Ist jetzt in Betrieb".format(obj.getState()))
    print("")

    print("... sleep 5 second")
    print("")
    time.sleep(5)

    obj.setState(setConcreteState(change_operation))
    print("###PC,[{0}]Machen".format(change_operation))
    obj.handle()
    print("###Der Betriebsstatus des PCs[{0}]wurde".format(obj.getState()))


if __name__ == "__main__":
    startMain(sys.argv[1], sys.argv[2])

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
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
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 "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
Besuchermuster in Python
Staatsmonade 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
Benutzerdefiniertes Zustandsraummodell in Python
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
Überprüfen Sie das Verhalten des Zerstörers 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