저번 글에서 "PHP의 상태 패턴이란 무엇인가요? 예제를 통해 알아보기 " PHP의 상태 패턴을 소개했습니다. 다음 기사에서는 PHP 디자인 패턴의 방문자 패턴을 이해하도록 안내합니다.
방문자 여러분, 마치 우리가 다른 사람의 집을 방문할 때처럼, 다른 사람들이 우리 집에 찾아올 때처럼. 우리 각자는 마치 하나의 실체와 같아서, 방문하는 모든 사람들이 한 명씩 우리에게 인사합니다. 결국 우리 중화민족은 예절과 환대를 중시하는 민족입니다. Visitor는 GoF의 23개 디자인 패턴 중 가장 복잡한 패턴이며, 각종 디자인 패턴 교과서에서 마지막에 배치되는 패턴이기도 하다. 난이도에 관계없이 먼저 정의와 구현을 살펴보겠습니다.
GoF 정의: 객체 구조의 각 요소에 작용하는 작업을 나타냅니다. 클래스를 변경하지 않고도 이러한 요소에 작용하는 새로운 작업을 정의할 수 있습니다
GoF 클래스 다이어그램
코드 구현
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);
고객님의 전화로 드디어 정식으로 만나 서로 소개를 하고 악수를 나눌 수 있게 되었습니다. 한 번의 방문을 행복하게 마쳤습니다.
전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php
Example
전체 소스 코드: 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 '阿里云发送短信!', PHP_EOL; } public function PushMsg(PushMessage $p) { echo '阿里云推送信息!', PHP_EOL; } } class JiGuang implements ServiceVisitor { public function SendMsg(SendMessage $s) { echo '极光发送短信!', PHP_EOL; } public function PushMsg(PushMessage $p) { echo '极光推送短信!', PHP_EOL; } } interface Message { public function Msg(ServiceVisitor $v); } class PushMessage implements Message { public function Msg(ServiceVisitor $v) { echo '推送脚本启动:'; $v->PushMsg($this); } } class SendMessage implements Message { public function Msg(ServiceVisitor $v) { echo '短信脚本启动:'; $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);
문자 메시지 보내기와 푸시 알림 보내기는 두 가지 변경되지 않은 동작, 즉 데이터 구조가 안정적이고 변경되지 않는다고 가정합니다.
추천 학습 : "PHP 비디오 튜토리얼"
》
위 내용은 PHP의 방문자 패턴에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!