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
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(); ?>
Vor- und Nachteile
Vorteile
Es lokalisiert das Verhalten in Bezug auf einen bestimmten Zustand
Es macht Zustandsübergänge sichtbar
Zustandsobjekte kann geteilt werden