Dans l'article précédent « Quel est le modèle d'état en PHP ? Apprenez-le à travers des exemples " Nous avons introduit le modèle d'état en PHP. L'article suivant vous amènera à comprendre le modèle de visiteur dans les modèles de conception PHP.
Les visiteurs, tout comme lorsque nous visitons la maison d’autres personnes, ou lorsque d’autres viennent chez nous pour nous rendre visite. Chacun de nous est comme une entité et tous ceux qui nous visitent nous saluent un par un. Après tout, notre nation chinoise est une nation qui accorde une grande attention à l'étiquette et à l'hospitalité. Le visiteur est le modèle le plus complexe parmi les 23 modèles de conception du GoF, et c'est également le modèle qui est placé en dernier dans divers manuels de modèles de conception. Quelle que soit la difficulté, regardons d’abord sa définition et sa mise en œuvre.
Définition GoF : Représente une opération qui agit sur chaque élément d'une structure d'objet. Il vous permet de définir de nouvelles opérations qui agissent sur ces éléments sans changer leurs classes
Diagramme de classes GoF
Implémentation du code
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 visiteur abstraite et deux une implémentation concrète. Il peut être considéré comme un jeune couple visitant notre maison !
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() { } }
L'abstraction et la mise en œuvre des éléments peuvent également être considérées comme des entités accessibles. Bien sûr, c'est moi et ma femme.
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); } } }
Il s'agit d'une structure d'objet utilisée pour enregistrer les entités d'éléments et effectuer des appels d'accès. Tout le monde s'est retrouvé dans le salon et a échangé des salutations. Ce n'est qu'un salon
$o = new ObjectStructure(); $o->Attach(new ConcreteElementA()); $o->Attach(new ConcreteElementB()); $v1 = new ConcreteVisitor1(); $v2 = new ConcreteVisitor2(); $o->Accept($v1); $o->Accept($v2);
L'appel du client a finalement permis à tout le monde de se rencontrer officiellement et de se présenter et de se serrer la main. Une visite s’est terminée avec bonheur.
Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php
Example
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor-msg.php
Explication<?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);Copier après la connexionNous supposons que l'envoi de messages texte et l'envoi de notifications push sont deux comportements inchangés, c'est-à-dire que leurs structures de données sont stables et inchangées
Auteur : Hardcore Project Manager
- De cette façon, nous pouvons facilement ajouter ServiceVisitor, lors de l'ajout de Baidu Cloud ou When en utilisant d'autres fournisseurs de SMS, il est très pratique d'ajouter des visiteurs. Le mode visiteur est plus adapté à une structure de données stable. Par exemple, les factures ne contiennent que des revenus et des dépenses, les sexes des gens sont uniquement des hommes et des femmes, etc.
- Adresse originale : https://juejin.cn/post/6844903993240453133
Apprentissage recommandé : "Tutoriel vidéo PHP"
》Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!