1. 의도
내부 상태가 변경되면 개체의 동작을 변경할 수 있습니다. 개체의 클래스가 수정된 것 같습니다
상태 모드가 바뀌는 위치가 객체의 상태입니다
2. 상태 패턴 구조도
3. 상태이상 주요 캐릭터
추상 상태(State) 역할: 환경 객체의 특정 상태에 해당하는 동작을 캡슐화하는 인터페이스를 정의합니다
ConcreteState 역할: 각 구체적인 상태 클래스는 환경(컨텍스트) 상태에 해당하는 동작을 구현합니다
컨텍스트 역할: 클라이언트가 관심을 갖는 인터페이스를 정의하고 특정 상태 클래스의 인스턴스를 유지합니다. 이 구체적인 상태 클래스의 인스턴스는 이 환경 객체의 현재 상태를 제공합니다
4. 상태 모드의 장점과 단점
1. 특정 상태와 관련된 동작을 현지화합니다
2. 상태 전환을 가시화합니다
3. 상태 객체 공유 가능
5. 상태 모드 적용 시나리오
1. 객체의 동작은 상태에 따라 달라지며 런타임 시 상태에 따라 동작을 변경해야 합니다.
2. 작업에는 여러 분기가 있는 다수의 조건문이 포함되어 있으며 이러한 분기는 개체의 상태에 따라 달라집니다. 이 상태는 일반적으로 하나 이상의 열거 상수로 표시됩니다. 종종 이 동일한 조건부 구조를 포함하는 여러 작업이 있습니다. 상태 모드는 각 조건부 분기를 별도의 클래스에 넣습니다. 이를 통해 객체의 상태를 다른 객체에 의존하지 않고 독립적으로 변경할 수 있는 객체로 처리할 수 있습니다
6. 상태 모드 및 기타 모드
싱글턴 모드: 특정 상태 객체는 일반적으로 싱글턴 모드입니다
플라이웨이트 패턴(Flyweight Pattern): 플라이웨이트 패턴은 상태 객체를 공유하는 시기와 방법을 설명합니다
7. 상태 모드 PHP 예제
<?php /** * 抽象状态角色 */ interface State { /** * 方法示例 */ public function handle(Context $context); } /** * 具体状态角色A * 单例类 */ class ConcreteStateA implements State { /* 唯一的实例 */ 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) { echo 'Concrete Sate A handle method<br />'; $context->setState(ConcreteStateB::getInstance()); } } /** * 具体状态角色B * 单例类 */ class ConcreteStateB implements State { /* 唯一的实例 */ 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) { echo 'Concrete Sate B handle method<br />'; $context->setState(ConcreteStateA::getInstance()); } } /** * 环境角色 */ class Context { private $_state; /** * 默认为StateA */ public function __construct() { $this->_state = ConcreteStateA::getInstance(); } public function setState(State $state) { $this->_state = $state; } public function request() { $this->_state->handle($this); } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { $context = new Context(); $context->request(); $context->request(); $context->request(); $context->request(); } } Client::main(); ?>
위는 PHP를 사용하여 상태 모드를 구현하는 코드입니다. 상태 모드에 대한 몇 가지 개념적 차이점도 있습니다. 모두의 학습에 도움이 되기를 바랍니다.