PHP의 방문자 패턴에 대한 심층 분석

青灯夜游
풀어 주다: 2023-04-10 13:54:02
앞으로
2045명이 탐색했습니다.

저번 글에서 "PHP의 상태 패턴이란 무엇인가요? 예제를 통해 알아보기 " PHP의 상태 패턴을 소개했습니다. 다음 기사에서는 PHP 디자인 패턴의 방문자 패턴을 이해하도록 안내합니다.

PHP의 방문자 패턴에 대한 심층 분석

방문자 여러분, 마치 우리가 다른 사람의 집을 방문할 때처럼, 다른 사람들이 우리 집에 찾아올 때처럼. 우리 각자는 마치 하나의 실체와 같아서, 방문하는 모든 사람들이 한 명씩 우리에게 인사합니다. 결국 우리 중화민족은 예절과 환대를 중시하는 민족입니다. Visitor는 GoF의 23개 디자인 패턴 중 가장 복잡한 패턴이며, 각종 디자인 패턴 교과서에서 마지막에 배치되는 패턴이기도 하다. 난이도에 관계없이 먼저 정의와 구현을 살펴보겠습니다.

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

GoF 정의: 객체 구조의 각 요소에 작용하는 작업을 나타냅니다. 클래스를 변경하지 않고도 이러한 요소에 작용하는 새로운 작업을 정의할 수 있습니다

GoF 클래스 다이어그램

PHP의 방문자 패턴에 대한 심층 분석

코드 구현

interface Visitor
{
    public function VisitConcreteElementA(ConcreteElementA $a);
    function VisitConcreteElementB(ConcreteElementB $b);
}

class ConcreteVisitor1 implements Visitor
{
    public function VisitConcreteElementA(ConcreteElementA $a)
    {
        echo get_class($a) . "被" . get_class($this) . "访问", PHP_EOL;
    }
    public function VisitConcreteElementB(ConcreteElementB $b)
    {
        echo get_class($b) . "被" . get_class($this) . "访问", PHP_EOL;
    }
}

class ConcreteVisitor2 implements Visitor
{
    public function VisitConcreteElementA(ConcreteElementA $a)
    {
        echo get_class($a) . "被" . get_class($this) . "访问", PHP_EOL;
    }
    public function VisitConcreteElementB(ConcreteElementB $b)
    {
        echo get_class($b) . "被" . get_class($this) . "访问", PHP_EOL;
    }
}
로그인 후 복사

추상 방문자 인터페이스와 두 가지 구체적인 구현. 우리 집을 방문하는 젊은 부부라고 할 수 있습니다!

interface Element
{
    public function Accept(Visitor $v);
}

class ConcreteElementA implements Element
{
    public function Accept(Visitor $v)
    {
        $v->VisitConcreteElementA($this);
    }
    public function OperationA()
    {

    }
}

class ConcreteElementB implements Element
{
    public function Accept(Visitor $v)
    {
        $v->VisitConcreteElementB($this);
    }
    public function OperationB()
    {

    }
}
로그인 후 복사

요소 추상화 및 구현도 액세스할 엔터티로 간주될 수 있습니다. 물론 나와 내 아내다.

class ObjectStructure
{
    private $elements = [];

    public function Attach(Element $element)
    {
        $this->elements[] = $element;
    }

    public function Detach(Element $element)
    {
        $position = 0;
        foreach ($this->elements as $e) {
            if ($e == $element) {
                unset($this->elements[$position]);
                break;
            }
            $position++;
        }
    }

    public function Accept(Visitor $visitor)
    {
        foreach ($this->elements as $e) {
            $e->Accept($visitor);
        }
    }

}
로그인 후 복사

요소 엔터티를 저장하고 액세스 호출을 수행하는 데 사용되는 개체 구조입니다. 모두 거실에서 만나 인사를 나눴습니다. 이곳은 거실입니다

$o = new ObjectStructure();
$o->Attach(new ConcreteElementA());
$o->Attach(new ConcreteElementB());

$v1 = new ConcreteVisitor1();
$v2 = new ConcreteVisitor2();

$o->Accept($v1);
$o->Accept($v2);
로그인 후 복사

고객님의 전화로 드디어 정식으로 만나 서로 소개를 하고 악수를 나눌 수 있게 되었습니다. 한 번의 방문을 행복하게 마쳤습니다.

  • 방문자가 지정된 요소를 호출하도록 합니다. 요소를 호출하는 방문자의 동작은 일반적으로 고정되어 있으며 거의 ​​변경되지 않는다는 점에 유의해야 합니다. 즉, VisitConcreteElementA()와 VisitConcreteElementB()의 두 가지 메서드입니다. 즉, 객체 구조를 정의하는 클래스는 거의 변경되지 않지만, 이 구조에 대해 새로운 작업을 정의해야 하는 경우가 자주 발생하면 방문자 패턴이 사용됩니다.
  • 객체에 대해 서로 다르고 관련 없는 작업을 많이 수행해야 합니다. 객체 구조, 그리고 이러한 작업이 이러한 객체의 클래스를 "오염"시키는 것을 방지하려는 경우 방문자 패턴은 데이터 구조가 변경되지 않는 상황에 적합합니다. 따라서 평소에는 사용할 수 없는 모드이고 필요할 때만 사용할 수 있는 모드입니다. GoF: "대부분의 경우 방문자 모드가 필요하지 않지만, 그렇게 하면 정말 필요합니다." 데이터 구조가 변경되지 않는 경우가 거의 없기 때문입니다.
  • 방문자 패턴의 몇 가지 장점과 단점: 새로운 작업을 추가하기 쉽고 관련 작업을 집중화하고 클래스 계층 구조를 통해 새로운 ConcreteElement 클래스를 추가하기가 어렵습니다. ; 누적 상태; 캡슐화 파기
저희 회사의 계정에는 수입과 지출이라는 두 가지 항목(요소)만 있지만, 부서(방문자)에 따라 액세스 시 다른 내용이 제공됩니다. 예를 들어 내가 확인할 때 월별 또는 분기별 요약 데이터만 확인하면 되는데, 재무 책임자는 상세한 수입과 지출 기록이 필요하고, 회계사는 회계를 할 때 완전한 세부 사항이 필요합니다. 회사를 운영하기 위해서는 정말 다양한 지식이 필요하다고 볼 수 있는데, 경영능력 뿐만 아니라 회계지식까지 꼭 알아야 할 내용입니다! !

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

Example

마지막 패턴 예제는 우리의 예제로 돌아왔습니다. 정보가 전송됩니다. 여러 서비스 제공업체에도 동일하게 적용됩니다. 방문자는 자체 SMS 전송 및 앱 푸시 인터페이스를 사용해야 합니다. 이때 방문자 모드를 이용하면 이들 방문자의 모든 동작을 조작하고 실현할 수 있습니다.

방문자 모드 정보 전송

PHP의 방문자 패턴에 대한 심층 분석

전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor-msg.php

<?php

interface ServiceVisitor
{
    public function SendMsg(SendMessage $s);
    function PushMsg(PushMessage $p);
}

class AliYun implements ServiceVisitor
{
    public function SendMsg(SendMessage $s)
    {
        echo &#39;阿里云发送短信!&#39;, PHP_EOL;
    }
    public function PushMsg(PushMessage $p)
    {
        echo &#39;阿里云推送信息!&#39;, PHP_EOL;
    }
}

class JiGuang implements ServiceVisitor
{
    public function SendMsg(SendMessage $s)
    {
        echo &#39;极光发送短信!&#39;, PHP_EOL;
    }
    public function PushMsg(PushMessage $p)
    {
        echo &#39;极光推送短信!&#39;, PHP_EOL;
    }
}

interface Message
{
    public function Msg(ServiceVisitor $v);
}

class PushMessage implements Message
{
    public function Msg(ServiceVisitor $v)
    {
        echo &#39;推送脚本启动:&#39;;
        $v->PushMsg($this);
    }
}

class SendMessage implements Message
{
    public function Msg(ServiceVisitor $v)
    {
        echo &#39;短信脚本启动:&#39;;
        $v->SendMsg($this);
    }
}

class ObjectStructure
{
    private $elements = [];

    public function Attach(Message $element)
    {
        $this->elements[] = $element;
    }

    public function Detach(Message $element)
    {
        $position = 0;
        foreach ($this->elements as $e) {
            if ($e == $element) {
                unset($this->elements[$position]);
                break;
            }
            $position++;
        }
    }

    public function Accept(ServiceVisitor $visitor)
    {
        foreach ($this->elements as $e) {
            $e->Msg($visitor);
        }
    }

}

$o = new ObjectStructure();
$o->Attach(new PushMessage());
$o->Attach(new SendMessage());

$v1 = new AliYun();
$v2 = new JiGuang();

$o->Accept($v1);
$o->Accept($v2);
로그인 후 복사
설명

문자 메시지 보내기와 푸시 알림 보내기는 두 가지 변경되지 않은 동작, 즉 데이터 구조가 안정적이고 변경되지 않는다고 가정합니다.
  • 이런 방법으로 Baidu Cloud를 추가할 때 또는 언제 추가할 때 ServiceVisitor를 쉽게 추가할 수 있습니다. 다른 SMS 제공자를 사용하면 방문자를 추가하는 것이 매우 편리합니다. 방문자 모드는 안정적인 데이터 구조에 더 적합합니다. 예를 들어 청구서에는 수입과 지출만 있고, 사람의 성별은 남자와 여자만 있는 것 등등.
  • 원본 주소 : https://juejin.cn/post/6844903993240453133
저자 : 하드코어 프로젝트 매니저

추천 학습 : "

PHP 비디오 튜토리얼"

위 내용은 PHP의 방문자 패턴에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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