>  기사  >  백엔드 개발  >  PHP의 전략 패턴에 대해 이야기해 봅시다.

PHP의 전략 패턴에 대해 이야기해 봅시다.

青灯夜游
青灯夜游앞으로
2021-07-09 19:34:343003검색

이전 기사 "PHP의 명령 모드에 대한 심층 분석"에서 PHP의 명령 모드를 소개했습니다. 이 기사에서는 PHP의 전략 모드를 이해하도록 안내합니다.

PHP의 전략 패턴에 대해 이야기해 봅시다.

정책 패턴이라고도 알려진 전략 패턴은 행동 디자인 패턴입니다.

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

GoF 정의: 일련의 알고리즘을 정의하고 하나씩 캡슐화하고 상호 교환 가능하게 만듭니다. 이 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.

GoF 클래스 다이어그램

PHP의 전략 패턴에 대해 이야기해 봅시다.

코드 구현

interface Strategy{
    function AlgorithmInterface();
}

class ConcreteStrategyA implements Strategy{
    function AlgorithmInterface(){
        echo "算法A";
    }
}

class ConcreteStrategyB implements Strategy{
    function AlgorithmInterface(){
        echo "算法B";
    }
}

class ConcreteStrategyC implements Strategy{
    function AlgorithmInterface(){
        echo "算法C";
    }
}

알고리즘 추상화 및 구현을 정의합니다.

class Context{
    private $strategy;
    function __construct(Strategy $s){
        $this->strategy = $s;
    }
    function ContextInterface(){
        
        $this->strategy->AlgorithmInterface();
    }
}

실행 환경 컨텍스트를 정의합니다.

$strategyA = new ConcreteStrategyA();
$context = new Context($strategyA);
$context->ContextInterface();

$strategyB = new ConcreteStrategyB();
$context = new Context($strategyB);
$context->ContextInterface();

$strategyC = new ConcreteStrategyC();
$context = new Context($strategyC);
$context->ContextInterface();

마지막으로 클라이언트 측에서 요청 시 적절한 알고리즘을 호출합니다.

  • 아주 심플한 디자인 패턴이지 않나요? 이 모델이 우리가 처음에 이야기한 Simple Factory
  • 와 매우 유사하다는 점을 눈치채셨나요? 그럼 차이점은 무엇인가요?
  • Factory 관련 패턴은 이름에서 알 수 있듯이 객체를 생성하고 새로운 객체를 반환하는 데 사용되는 패턴입니다. 객체의 어떤 메서드를 호출할지 결정하는 것은 클라이언트의 몫입니다
  • 전략 패턴 속성의 동작 패턴은 실행 컨텍스트를 통해 호출할 함수 메서드를 캡슐화하며, 클라이언트는 실행 컨텍스트의 메서드만 호출하면 됩니다
  • 여기서는 클라이언트가 특정 알고리즘 클래스를 인스턴스화해야 한다는 점을 알 수 있는데, 이는 Simple Factory만큼 사용하기 쉽지 않은 것 같습니다. 이 경우 팩토리 패턴과 전략 패턴을 결합하여 패턴을 구현해 보는 것은 어떨까요?
  • 이 구현을 모든 사람에게 생각하는 질문으로 남겨주세요. 팁: Context 클래스의 __construct를 간단한 팩토리 메서드로 전환하세요

간단한 팩토리와 매우 유사하므로 간단한 팩토리 메서드도 따릅니다. 휴대폰을 일괄 생산하기 위해 공장(ConcreteStrategy)을 찾고자 하는 휴대폰 제조업체(Client)이며, 채널 제공자(Context)를 통해 휴대폰을 제조하기 위해 이 공장에 주문합니다. 파운드리(전략)에서 직접 생산물을 공장으로 이관합니다. 완성된 휴대폰이 나에게 배송됩니다(ContextInterface()). 마찬가지로, 구체적인 구현에 신경 쓸 필요는 없고 우리에게 연락하는 채널 공급업체만 감독하면 됩니다.

전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy.php

Example

아직 SMS 기능이 있습니다. 구체적인 요구사항은 Simple Factory 패턴으로 설명하지만 이번에는 전략 패턴을 활용해서 구현해보겠습니다!

SMS 전송 클래스 다이어그램

PHP의 전략 패턴에 대해 이야기해 봅시다.

전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy-message.php

<?php

interface Message
{
    public function send();
}

class BaiduYunMessage implements Message
{
    function send()
    {
        echo &#39;百度云发送信息!&#39;;
    }
}

class AliYunMessage implements Message
{
    public function send()
    {
        echo &#39;阿里云发送信息!&#39;;
    }
}

class JiguangMessage implements Message
{
    public function send()
    {
        echo &#39;极光发送信息!&#39;;
    }
}

class MessageContext
{
    private $message;
    public function __construct(Message $msg)
    {
        $this->message = $msg;
    }
    public function SendMessage()
    {
        $this->message->send();
    }
}

$bdMsg = new BaiduYunMessage();
$msgCtx = new MessageContext($bdMsg);
$msgCtx->SendMessage();

$alMsg = new AliYunMessage();
$msgCtx = new MessageContext($alMsg);
$msgCtx->SendMessage();

$jgMsg = new JiguangMessage();
$msgCtx = new MessageContext($jgMsg);
$msgCtx->SendMessage();

설명

  • 아래 클래스 다이어그램을 비교해 보세요. Simple Factory 패턴
  • 전략 패턴은 개념적으로 동일한 작업을 완료하지만 구현이 다릅니다. 사용 방법은 모두의 관심에 달려 있습니다
  • 전략 모드는 단위 테스트를 최적화할 수 있습니다. 각 알고리즘에는 자체 클래스가 있으므로 자체 인터페이스를 통해 개별적으로 테스트할 수 있기 때문입니다

원본 주소: https://juejin.cn/post/6844903955860996110

저자: 하드코어 프로젝트 매니저

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

위 내용은 PHP의 전략 패턴에 대해 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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