상태 상태 모드는 GOF의 23개 모드 중 하나이며 명령 모드와 마찬가지로 행동 모드이기도 합니다. 상태 모드는 명령 모드와 매우 유사하며 "인터페이스 구현 클래스" 모드를 적용하고 인터페이스 지향 프로그래밍 원리를 구현합니다.
상태 패턴은 객체 생성 패턴으로, 객체의 내부 상태가 변경되면 객체의 동작이 변경되도록 하는 것입니다. 더 일반적인 예는 네트워크 연결을 나타내는 TCPConnection 클래스에 있습니다. TCPConnection 개체의 상태는 연결이 설정됨(설정됨), 수신 대기 중, 연결이 닫혀 있음(닫힘) 등 여러 가지 상태 중 하나입니다. . TCPConnection 객체는 다른 객체로부터 요청을 받으면 자체 상태에 따라 다르게 응답합니다.
예를 들어 열기 요청의 결과는 연결이 닫혔는지 아니면 연결이 설정되었는지에 따라 달라집니다. 상태 모드는 TCPConnection이 각 상태에서 어떻게 다른 동작을 나타내는지 설명합니다. 이 모델의 핵심 아이디어는 네트워크의 연결 상태를 나타내기 위해 TCPState라는 추상 클래스를 도입하는 것입니다. TCPState 클래스는 다양한 작동 상태를 나타내는 다양한 하위 클래스에 대한 공용 인터페이스를 선언합니다. TCPState의 서브클래스는 특정 상태와 관련된 동작을 구현합니다. 예를 들어 TCPSetup 및 TCPClosed 클래스는 각각 TCPConnection의 연결 설정 및 닫힌 상태에 특정한 동작을 구현합니다.
예를 들어, 사람에게는 화남, 행복함, 미쳤음과 같은 상태가 있습니다. 이러한 상태에서 동일한 일을 해도 결과가 달라질 수 있으며, 사람의 기분은 이 세 가지 상태를 순환할 수 있습니다. 기분 상태 클래스를 사용하여 사람의 기분을 표현하고, 미친, 해피, 앵그리 클래스를 사용하여 다양한 기분을 표현합니다.
먼저 예시를 살펴보겠습니다:
코드 복사 코드는 다음과 같습니다:
/**
* 상태 패턴
*
* 내부 상태가 변경되면 객체의 동작을 변경하여 객체가 속한 클래스를 수정하는 것처럼 보이게 합니다.
*
*/
인터페이스 상태
{
공용 함수 핸들($state)
공용 함수 디스플레이()
}
클래스 컨텍스트
{
비공개 $_state = null
공용 함수 __construct($state)
{
$this->setState($state)
}
공용 함수 setState ($state)
{
$this->_state = $state;
}
공개 함수 요청()
{
$this->_state->display ();
$this->_state->handle($this)
}
}
StateA 클래스가 State를 구현합니다.
{
공용 함수 핸들($context)
{
$context->setState(new StateB());
}
공용 함수 display()
{
echo "state A
";
}
}
StateB 구현 상태
{
공용 함수 핸들($context)
{
$context->setState(new StateC()); 🎜>}
공용 함수 표시()
{
echo "state B
"
}
}
StateC가 State를 구현함
{
공용 함수 핸들($ context)
{
$context->setState(new StateA())
}
공용 함수 디스플레이()
{
echo "state C
";
}
}
// 인스턴스화
$objContext = new Context(new StateB());
$objContext->request();
$objContext ->request();
$objContext->request()
$objContext->request(); >
상태 모드를 이해하는 데는 두 가지 핵심 사항이 있습니다.
1. 일반적으로 명령 모드 인터페이스에는 한 가지 방법만 있습니다. 상태 모드 인터페이스에는 하나 이상의 메서드가 있습니다. 또한 상태 패턴 구현 클래스의 메서드는 일반적으로 값을 반환하거나 인스턴스 변수의 값을 변경합니다. 즉, 상태 패턴은 일반적으로 객체의 상태와 관련이 있습니다. 구현 클래스의 메서드에는 인터페이스의 메서드를 재정의하는 다양한 기능이 있습니다. 명령 모드와 마찬가지로 상태 모드도 if...else와 같은 조건 선택 문을 제거하는 데 사용할 수 있습니다.