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

상태 패턴 및 해당 PHP 구현

伊谢尔伦
풀어 주다: 2023-03-02 18:36:02
원래의
1252명이 탐색했습니다.

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

주역

추상 상태(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();
?>
로그인 후 복사

장점과 단점

장점

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

상태 전환을 표시합니다.

상태 개체 공유 가능


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿