Maison  >  Article  >  développement back-end  >  Une analyse approfondie du modèle de visiteur en PHP

Une analyse approfondie du modèle de visiteur en PHP

青灯夜游
青灯夜游avant
2021-08-04 10:54:322048parcourir

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.

Une analyse approfondie du modèle de visiteur en 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.

Diagramme de classe Gof et explication

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

Une analyse approfondie du modèle de visiteur en PHP

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.

  • Laissez les visiteurs appeler l'élément spécifié. Il convient de noter ici que le comportement des visiteurs appelant des éléments est généralement fixe et change rarement. Autrement dit, les deux méthodes VisitConcreteElementA() et VisitConcreteElementB(). C'est-à-dire que la classe qui définit la structure de l'objet change rarement, mais lorsqu'il est souvent nécessaire de définir de nouvelles opérations sur cette structure, le modèle visiteur est utilisé
  • Il est nécessaire d'effectuer de nombreuses opérations différentes et sans rapport sur les objets dans une structure d'objet, et Lorsque vous souhaitez éviter que ces opérations "polluent" les classes de ces objets, le modèle visiteur convient aux situations où la structure des données ne change pas. C’est donc un mode que vous ne pouvez pas utiliser normalement, mais vous ne pouvez utiliser ce mode qu’en cas de besoin. GoF : "La plupart du temps, vous n'avez pas besoin du mode visiteur, mais lorsque vous l'avez besoin, vous en avez vraiment besoin." Parce qu'il existe peu de situations où la structure des données ne change pas
  • Quelques avantages et inconvénients du modèle de visiteur : facile d'ajouter de nouvelles opérations ; concentrer les opérations liées et séparer les opérations non pertinentes, il est difficile d'ajouter de nouvelles classes ConcreteElement ; ; Statut accumulé ; Destruction de l'encapsulation
Les comptes de notre entreprise ne comportent que deux postes (Éléments) : les revenus et les dépenses, mais différents départements (Visiteurs) donneront des contenus différents lors de leur accès. Par exemple, lorsque je vérifie, il me suffit de vérifier les données récapitulatives mensuelles ou trimestrielles. Le directeur financier a besoin de registres détaillés des revenus et des dépenses, et le comptable a besoin de détails complets lors de la comptabilité. On voit que le fonctionnement de l'entreprise nécessite en effet un très large éventail de connaissances, non seulement des capacités de gestion, mais aussi des connaissances en comptabilité qui sont un contenu incontournable ! !

Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php

Example

Le dernier exemple de modèle est de retour à Notre les informations sont envoyées. Il en va de même pour plusieurs fournisseurs de services. En tant que visiteurs, ils doivent utiliser leurs propres interfaces d'envoi de SMS et de push APP. A ce moment, vous pouvez utiliser le mode visiteur pour opérer et réaliser toutes les opérations de ces visiteurs.

Envoi d'informations en mode visiteur

Une analyse approfondie du modèle de visiteur en PHP

Code source complet : 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);

Explication

Nous 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
  • 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
Auteur : Hardcore Project Manager

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer