>  기사  >  백엔드 개발  >  PHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요

PHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요

青灯夜游
青灯夜游앞으로
2021-07-27 18:33:362120검색

이전 기사 "PHP의 싱글턴 모드에 대해 이야기합시다"에서 PHP의 싱글턴 모드를 소개했습니다. 다음 기사에서는 PHP 디자인 패턴의 상태 모드를 이해하도록 안내합니다.

PHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요

상태 패턴은 실제로 문자 그대로 이해하기가 쉽지 않습니다. 여기서 상태는 무엇을 의미하나요? 상태를 저장하시겠습니까? 메모모드가 아닙니다. 사실 여기서의 상태는 클래스의 상태를 말하며, 클래스의 특정 상태를 변경함으로써 클래스가 다른 클래스처럼 느껴집니다. 말하기가 좀 어렵기 때문에 먼저 개념을 익히고 나중에 읽어보도록 하겠습니다.

Gof 클래스 다이어그램 및 설명

GoF 정의: 객체의 내부 상태가 변경되면 객체의 동작을 변경할 수 있습니다. 객체의 클래스가 수정된 것 같습니다

GoF 클래스 다이어그램

PHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요

코드 구현

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() 개체를 호출하여 스위치 상태를 달성합니다.

  • 길이 보이나요? 여기서 상태 변경은 외부 구현 클래스에 캡슐화됩니다. 그러면 상태 패턴은 컨텍스트나 대상 클래스 내에서 전환되지 않습니다. 기본 클래스 다이어그램의 이 예는 실제로 상태 패턴의 실제 목적은 복잡한 if 중첩 문제를 해결하기 위해 외부 상태 클래스에 하나씩 입력하는 것입니다. 다음 예제에서는
  • 이 적용되는 것을 볼 수 있습니다. 객체의 동작은 상태에 따라 다르며 런타임 시 상태에 따라 동작을 변경해야 합니다. 작업에는 다수의 다중 분기 조건문이 포함되어 있습니다. 브랜치는 객체의 상태에 따라 달라집니다.
  • 상태 패턴의 특징은 다음과 같습니다. 특정 상태와 관련된 동작을 지역화합니다. 상태 객체는 순서 시스템에서 흔히 볼 수 있습니다. 멤버십 시스템, OA 시스템, 즉 그 과정에서 다양한 상태 변화가 있을 것이며, 상태 모델은 전반적인 디자인과 건축에 사용될 수 있습니다
  • 휴대전화 시스템에 자체 쇼핑몰 시스템을 맞춤화했고, 휴대폰으로 편리하게 주문하실 수 있습니다. 상품을 쇼핑하세요. 주문(컨텍스트)에는 미결제, 지불, 주문 완료, 주문 환불 등 여러 상태(상태)가 있습니다. 우리는 이러한 상태를 해당 상태 클래스에 넣어서 구현합니다. 예를 들어 결제 후 영수증을 기다리고 구매자가 물류 양식을 작성할 때까지 기다립니다. , 이런 식으로 상태 모드를 우리 쇼핑몰에서 유연하게 사용할 수 있습니다! !

전체 코드: 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.phpPHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요

<?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 &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(990);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(660);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(10);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

참고

상태 모드를 사용하지 않는 경우 회원의 할인() 메소드에서 if...else...판정 조건을 여러 레이어로 작성해야 할 수도 있습니다

동시에 이 또한 점점 더 많은 메소드 경험을 가져오고 유지 관리가 점점 더 어려워지는 문제입니다
  • 이 문제를 해결하기 위해 상태 모델이 존재합니다
  • discount() 동작의 결과가 Member 개체 자체의 상태에 따라 달라지는 경우( 멤버십 포인트), 상태 모델이 최적 선택됨, 즉 위에서 언급한 객체의 동작은 상태에 따라 다릅니다
  • 원본 주소: https://juejin.cn/post/6844903991562731534
저자: Hardcore Project 매니저

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP의 상태 패턴은 무엇입니까? 예시를 통해 배워보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제