Zustandsmuster und seine PHP-Implementierung

伊谢尔伦
Freigeben: 2023-03-02 18:36:02
Original
1247 Leute haben es durchsucht

Das Zustandsmuster ist ein Verhaltensmuster, das es einem Objekt ermöglicht, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert. Das Objekt scheint seine Klasse geändert zu haben, und der Ort der Zustandsmodusänderung liegt im Zustand des Objekts.

Hauptrolle

Abstrakter Zustand (State) Rolle: Definieren Sie eine Schnittstelle, um das Verhalten zu kapseln, das einem bestimmten Zustand des Umgebungsobjekts entspricht

Konkreter Zustand (ConcreteState) Rolle: Jede spezifische Zustandsklasse implementiert das Verhalten, das einem Zustand der Umgebung (Kontext) entspricht.

Rolle der Umgebung (Kontext): Definiert die Schnittstelle, an der der Client interessiert ist, und behält eine Instanz der spezifischen Zustandsklasse bei. Eine Instanz dieser konkreten Zustandsklasse gibt den aktuellen Zustand dieses Umgebungsobjekts an

Anwendbarkeit

Das Verhalten eines Objekts hängt von seinem Zustand ab und es muss seinen Zustand zur Laufzeit basierend auf dem Zustandsverhalten ändern

Eine Operation enthält eine große Anzahl bedingter Anweisungen mit mehreren Verzweigungen, und diese Verzweigungen hängen vom Zustand des Objekts ab. Dieser Zustand wird normalerweise durch eine oder mehrere Aufzählungskonstanten dargestellt. Oft gibt es mehrere Operationen, die dieselbe bedingte Struktur enthalten. Der Statusmodus ordnet jeden bedingten Zweig einer separaten Klasse zu. Dadurch können Sie den Zustand des Objekts als Objekt behandeln, das sich unabhängig ändern kann, ohne auf andere Objekte angewiesen zu sein

Klassendiagramm

Zustandsmuster und seine PHP-Implementierung

Instanz

<?php
interface State { // 抽象状态角色
   public function handle(Context $context); // 方法示例
}

class ConcreteStateA implements State { // 具体状态角色A
   private static $_instance = null;
   private function __construct() {}
   public static function getInstance() { // 静态工厂方法,返还此类的唯一实例
       if (is_null(self::$_instance)) {
           self::$_instance = new ConcreteStateA();
       }
       return self::$_instance;
   }

   public function handle(Context $context) {
       $context->setState(ConcreteStateB::getInstance());
   }

}

class ConcreteStateB implements State { // 具体状态角色B
   private static $_instance = null;
   private function __construct() {}
   public static function getInstance() {
       if (is_null(self::$_instance)) {
           self::$_instance = new ConcreteStateB();
       }
       return self::$_instance;
   }

   public function handle(Context $context) {
       $context->setState(ConcreteStateA::getInstance());
   }
}

class Context { // 环境角色 
   private $_state;
   public function __construct() { // 默认为stateA
       $this->_state = ConcreteStateA::getInstance();
   }
   public function setState(State $state) {
       $this->_state = $state;
   }
   public function request() {
       $this->_state->handle($this);
   }
}

// client
$context = new Context();
$context->request();
$context->request();
$context->request();
$context->request();
?>
Nach dem Login kopieren

Vor- und Nachteile

Vorteile

Es lokalisiert das Verhalten in Bezug auf einen bestimmten Zustand

Es macht Zustandsübergänge sichtbar

Zustandsobjekte kann geteilt werden


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage