이전 기사 "PHP의 싱글턴 모드에 대해 이야기합시다"에서 PHP의 싱글턴 모드를 소개했습니다. 다음 기사에서는 PHP 디자인 패턴의 상태 모드를 이해하도록 안내합니다.
상태 패턴은 실제로 문자 그대로 이해하기가 쉽지 않습니다. 여기서 상태는 무엇을 의미하나요? 상태를 저장하시겠습니까? 메모모드가 아닙니다. 사실 여기서의 상태는 클래스의 상태를 말하며, 클래스의 특정 상태를 변경함으로써 클래스가 다른 클래스처럼 느껴집니다. 말하기가 좀 어렵기 때문에 먼저 개념을 익히고 나중에 읽어보도록 하겠습니다.
GoF 정의: 객체의 내부 상태가 변경되면 객체의 동작을 변경할 수 있습니다. 객체의 클래스가 수정된 것 같습니다
GoF 클래스 다이어그램
코드 구현
class Context { private $state; public function SetState(State $state): void { $this->state = $state; } public function Request(): void { $this->state = $this->state->Handle(); } }
대상 클래스라고도 할 수 있는 컨텍스트 클래스 내부에 상태 객체가 있습니다. Request()를 호출할 때 상태 클래스의 Handle() 메서드를 호출합니다. 그 목적은 현재 컨텍스트 클래스 상태의 변경 사항이 외부 상태 클래스에 의해 제어된다는 것입니다.
interface State { public function Handle(): State; } class ConcreteStateA implements State { public function Handle(): State { echo '当前是A状态', PHP_EOL; return new ConcreteStateB(); } } class ConcreteStateB implements State { public function Handle(): State { echo '当前是B状态', PHP_EOL; return new ConcreteStateA(); } }
추상 상태 인터페이스와 두 가지 구체적인 구현. 이 두 가지 특정 구현은 실제로 서로를 호출합니다. 구현의 효과는 컨텍스트 클래스가 Request() 메서드를 호출할 때마다 내부 상태 클래스가 다른 상태로 변경된다는 것입니다. 켜짐과 꺼짐 사이를 전환하는 스위치와 같습니다.
$c = new Context(); $stateA = new ConcreteStateA(); $c->SetState($stateA); $c->Request(); $c->Request(); $c->Request(); $c->Request();
클라이언트 구현은 컨텍스트 개체를 인스턴스화하고 초기 상태를 설정한 다음 계속해서 Request() 개체를 호출하여 스위치 상태를 달성합니다.
전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php
Example
전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.php
<?php class Member { private $state; private $score; public function SetState($state) { $this->state = $state; } public function SetScore($score) { $this->score = $score; } public function GetScore() { return $this->score; } public function discount() { return $this->state->discount($this); } } interface State { public function discount($member); } class PlatinumMemeberState implements State { public function discount($member) { if ($member->GetScore() >= 1000) { return 0.80; } else { $member->SetState(new GoldMemberState()); return $member->discount(); } } } class GoldMemberState implements State { public function discount($member) { if ($member->GetScore() >= 800) { return 0.85; } else { $member->SetState(new SilverMemberState()); return $member->discount(); } } } class SilverMemberState implements State { public function discount($member) { if ($member->GetScore() >= 500) { return 0.90; } else { $member->SetState(new GeneralMemberState()); return $member->discount(); } } } class GeneralMemberState implements State { public function discount($member) { return 0.95; } } $m = new Member(); $m->SetState(new PlatinumMemeberState()); $m->SetScore(1200); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(990); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(660); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(10); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;
참고
상태 모드를 사용하지 않는 경우 회원의 할인() 메소드에서 if...else...판정 조건을 여러 레이어로 작성해야 할 수도 있습니다
동시에 이 또한 점점 더 많은 메소드 경험을 가져오고 유지 관리가 점점 더 어려워지는 문제입니다추천 학습: "PHP 비디오 튜토리얼"
위 내용은 PHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!