>백엔드 개발 >PHP 튜토리얼 >상태 패턴 및 해당 PHP 구현

상태 패턴 및 해당 PHP 구현

伊谢尔伦
伊谢尔伦원래의
2016-12-01 11:48:241253검색

상태 패턴은 객체의 내부 상태가 변경되면 객체의 동작도 변경되도록 하는 동작 패턴입니다. 객체는 클래스를 수정한 것으로 보이며 상태 모드 변경 위치는 객체의 상태에 있습니다.

주역

추상 상태(State) 역할: 환경 객체의 특정 상태에 해당하는 동작을 캡슐화하는 인터페이스를 정의

구체 상태(ConcreteState) 역할: 각 특정 상태 클래스는 환경(컨텍스트)의 상태에 해당하는 동작을 구현합니다.

환경(컨텍스트) 역할: 클라이언트가 관심 있는 인터페이스를 정의하고 특정 상태 클래스의 인스턴스를 유지합니다. 이 구체적인 상태 클래스의 인스턴스는 이 환경 객체의 현재 상태를 제공합니다.

적용 가능성

객체의 동작은 상태에 따라 다르며 상태에 따라 런타임 시 상태를 변경해야 합니다. 동작

작업에는 여러 분기가 있는 다수의 조건문이 포함되어 있으며 이러한 분기는 객체의 상태에 따라 달라집니다. 이 상태는 일반적으로 하나 이상의 열거 상수로 표시됩니다. 종종 이 동일한 조건부 구조를 포함하는 여러 작업이 있습니다. 상태 모드는 각 조건부 분기를 별도의 클래스에 넣습니다. 이를 통해 객체의 상태를 다른 객체에 의존하지 않고 독립적으로 변경할 수 있는 객체로 처리할 수 있습니다.

클래스 다이어그램

상태 패턴 및 해당 PHP 구현

인스턴스

<?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();
?>

장점과 단점

장점

특정 상태와 관련된 동작을 현지화합니다.

상태 전환을 표시합니다.

상태 개체 공유 가능


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.