Heim >Backend-Entwicklung >PHP-Tutorial >Was ist das Zustandsmuster in PHP? Lernen Sie es anhand von Beispielen

Was ist das Zustandsmuster in PHP? Lernen Sie es anhand von Beispielen

青灯夜游
青灯夜游nach vorne
2021-07-27 18:33:362136Durchsuche

Im vorherigen Artikel „Sprechen wir über den Singleton-Modus in PHP“ haben wir den Singleton-Modus in PHP vorgestellt. Der folgende Artikel führt Sie zum Verständnis des Statusmodus im PHP-Designmuster

Was ist das Zustandsmuster in PHP? Lernen Sie es anhand von Beispielen

state Das Muster ist tatsächlich nicht ganz einfach wörtlich zu verstehen. Was bedeutet der Status hier? Status speichern? Das ist nicht der Memomodus. Tatsächlich ist der Zustand hier der Zustand der Klasse. Durch die Änderung eines bestimmten Zustands der Klasse fühlt sich die Klasse wie eine andere Klasse an. Es ist etwas schwer zu sagen, also lernen wir zunächst das Konzept kennen und lesen es dann später.

Gof-Klassendiagramm und Erklärung

GoF-Definition: Ermöglicht einem Objekt, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert. Das Objekt scheint seine Klasse geändert zu haben.

GoF-Klassendiagramm. Rufen Sie beim Aufruf von Request() die Handle()-Methode der Statusklasse auf. Der Zweck besteht darin, dass Änderungen im aktuellen Kontextklassenstatus von der externen Statusklasse gesteuert werden.

class Context
{
    private $state;
    public function SetState(State $state): void
    {
        $this->state = $state;
    }
    public function Request(): void
    {
        $this->state = $this->state->Handle();
    }
}

Abstrakte Zustandsschnittstelle und zwei konkrete Implementierungen. Diese beiden spezifischen Implementierungen rufen sich tatsächlich gegenseitig auf. Der Effekt der Implementierung besteht darin, dass jedes Mal, wenn die Kontextklasse die Request()-Methode aufruft, die interne Zustandsklasse in einen anderen Zustand wechselt. Es ist wie ein Schalter, der zwischen Ein und Aus hin und her schaltet.

interface State
{
    public function Handle(): State;
}

class ConcreteStateA implements State
{
    public function Handle(): State
    {
        echo '当前是A状态', PHP_EOL;
        return new ConcreteStateB();
    }
}

class ConcreteStateB implements State
{
    public function Handle(): State
    {
        echo '当前是B状态', PHP_EOL;
        return new ConcreteStateA();
    }
}
Was ist das Zustandsmuster in PHP? Lernen Sie es anhand von BeispielenDie Implementierung des Clients instanziiert das Kontextobjekt, legt den Anfangszustand fest und ruft dann kontinuierlich das Request()-Objekt auf, um den Schaltzustand zu erreichen.

Sehen Sie den Weg? Hier werden die Zustandsänderungen in der externen Implementierungsklasse gekapselt. Der Zustand wird nicht innerhalb des Kontexts oder der Zielklasse umgeschaltet. Dieses Beispiel des Standardklassendiagramms ist tatsächlich zu einfach. Der eigentliche Zweck des Zustandsmusters besteht darin, das komplexe Verschachtelungsproblem nacheinander in die externen Zustandsklassen einzufügen Folgende Beispiele Wir werden sehen, dass

anwendbar ist auf: Das Verhalten eines Objekts hängt von seinem Zustand ab und es muss sein Verhalten entsprechend dem Zustand zur Laufzeit ändern. Eine Operation enthält eine große Anzahl von bedingten Anweisungen mit mehreren Zweigen Diese Zweige hängen vom Zustand des Objekts ab.

Die Merkmale des Zustandsmusters sind: Es lokalisiert das Verhalten, das sich auf einen bestimmten Zustand bezieht; , Mitgliedschaftssysteme und OA-Systeme Das heißt, es wird im Prozess verschiedene Statusänderungen geben, und das Statusmodell kann für das Gesamtdesign und die Architektur verwendet werden

Wir haben unser eigenes Mall-System im Mobiltelefonsystem angepasst , und Sie können bequem über Ihr Mobiltelefon Bestellungen aufgeben. Kaufen Sie unsere Artikel. Eine Bestellung (Kontext) hat mehrere Status (Status), z. B. unbezahlt, bezahlt, Bestellung abgeschlossen, Bestellung erstattet und viele Status. Wir ordnen diese Zustände den entsprechenden Zustandsklassen zu, um sie zu implementieren. Verschiedene Zustandsklassen rufen beispielsweise nach der Zahlung den Erhalt der Ware und nach der Rückerstattung das Ausfüllen des Käufers ab Das Logistikformular Warten Sie, auf diese Weise kann der Statusmodus in unserem Einkaufszentrum flexibel genutzt werden! !
  • Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php
  • Beispiel
  • Übliche Mall-Anwendungen haben aufgrund von Mitgliedern Aufgrund der Existenz des Systems können Mitglieder mit höheren Stufen im Allgemeinen mehr Rabatte erhalten. Derzeit können Sie über den Statusmodus problemlos Rabatte auf Mitgliederstufen erhalten. Das Wichtigste ist natürlich, dass Sie im Statusmodus nur dann die entsprechende Mitgliedsrabattstatus-Unterklasse hinzufügen können, wenn Sie eine Mitgliedsstufe hinzufügen oder löschen müssen. Es muss kein anderer Geschäftscode geändert werden. Werfen wir einen Blick auf die spezifische Implementierung!

Mitglieder-Rabatttabelle

Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.php
$c = new Context();
$stateA = new ConcreteStateA();
$c->SetState($stateA);
$c->Request();
$c->Request();
$c->Request();
$c->Request();

Hinweis

Wenn Sie den Statusmodus nicht verwenden, müssen wir in der discount()-Methode des Mitglieds möglicherweise viele Ebenen von if...else...-Beurteilungsbedingungen schreiben

Gleichzeitig auch dies bringt immer mehr Methodenerfahrung mit sich Es ist ein Problem, das langwierig und immer schwieriger zu warten istWas ist das Zustandsmuster in PHP? Lernen Sie es anhand von Beispielen

Das Zustandsmodell existiert, um dieses Problem zu lösen

Wenn das Ergebnis des discount()-Verhaltens vom Status des Mitgliedsobjekts selbst abhängt ( Mitgliedschaftspunkte), das Zustandsmodell ist optimal ausgewählt, das heißt, das oben erwähnte Verhalten eines Objekts hängt von seinem Status ab

Originaladresse: https://juejin.cn/post/6844903991562731534

Autor: Hardcore Project Manager

Das obige ist der detaillierte Inhalt vonWas ist das Zustandsmuster in PHP? Lernen Sie es anhand von Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen