상태 패턴은 객체의 내부 상태가 변경되면 객체의 동작도 변경되도록 하는 동작 패턴입니다. 객체는 클래스를 수정한 것으로 보이며 상태 모드 변경 위치는 객체의 상태에 있습니다.
주역
추상 상태(State) 역할: 환경 객체의 특정 상태에 해당하는 동작을 캡슐화하는 인터페이스를 정의
구체 상태(ConcreteState) 역할: 각 특정 상태 클래스는 환경(컨텍스트)의 상태에 해당하는 동작을 구현합니다.
환경(컨텍스트) 역할: 클라이언트가 관심 있는 인터페이스를 정의하고 특정 상태 클래스의 인스턴스를 유지합니다. 이 구체적인 상태 클래스의 인스턴스는 이 환경 객체의 현재 상태를 제공합니다.
적용 가능성
객체의 동작은 상태에 따라 다르며 상태에 따라 런타임 시 상태를 변경해야 합니다. 동작
작업에는 여러 분기가 있는 다수의 조건문이 포함되어 있으며 이러한 분기는 객체의 상태에 따라 달라집니다. 이 상태는 일반적으로 하나 이상의 열거 상수로 표시됩니다. 종종 이 동일한 조건부 구조를 포함하는 여러 작업이 있습니다. 상태 모드는 각 조건부 분기를 별도의 클래스에 넣습니다. 이를 통해 객체의 상태를 다른 객체에 의존하지 않고 독립적으로 변경할 수 있는 객체로 처리할 수 있습니다.
클래스 다이어그램
인스턴스
<?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(); ?>
장점과 단점
장점
특정 상태와 관련된 동작을 현지화합니다.
상태 전환을 표시합니다.
상태 개체 공유 가능