Maison  >  Article  >  développement back-end  >  Découvrez le modèle de poids mouche en PHP dans un article

Découvrez le modèle de poids mouche en PHP dans un article

青灯夜游
青灯夜游avant
2021-07-14 19:32:552863parcourir

Dans l'article précédent "Parlez du mode proxy en PHP (proxy direct et proxy inverse)", nous avons présenté le mode proxy en PHP. Cet article vous amènera à comprendre le poids mouche dans le modèle de conception PHP.

Découvrez le modèle de poids mouche en PHP dans un article

Flying Dollar Mode, le mot "flying dollar" n'a en fait aucune signification particulière en chinois, nous devons donc le décomposer et l'examiner. « Xiang » signifie partage, et « Yuan » signifie éléments. Cela semble facile à comprendre, partager certains éléments.

Diagramme de classes Gof et explication

Définition GoF : utiliser une technologie partagée pour prendre en charge efficacement un grand nombre d'objets à granularité fine

Diagramme de classes GoF

Découvrez le modèle de poids mouche en PHP dans un article

implémentation du code

interface Flyweight
{
    public function operation($extrinsicState) : void;
}

class ConcreteFlyweight implements Flyweight
{
    private $intrinsicState = 101;
    function operation($extrinsicState) : void
    {
        echo '共享享元对象' . ($extrinsicState + $this->intrinsicState) . PHP_EOL;
    }
}

class UnsharedConcreteFlyweight implements Flyweight
{
    private $allState = 1000;
    public function operation($extrinsicState) : void
    {
        echo '非共享享元对象:' . ($extrinsicState + $this->allState) . PHP_EOL;
    }
}

Définissez l'interface de partage et son implémentation, notez qu'il existe deux implémentations ici, ConcreteFlyweigh partage l'état, UnsharedConcreteFlyweight ne partage pas ou son état n'a pas besoin d'être partagé

class FlyweightFactory
{
    private $flyweights = [];

    public function getFlyweight($key) : Flyweight
    {
        if (!array_key_exists($key, $this->flyweights)) {
            $this->flyweights[$key] = new ConcreteFlyweight();
        }
        return $this->flyweights[$key];
    }
}

Enregistrez les objets qui doivent être partagés et utilisez-le comme usine pour créer l'objet de partage requis, garantissant qu'il n'y aura qu'un seul objet avec la même valeur de clé, économisant ainsi le coût de création du même objet

$factory = new FlyweightFactory();

$extrinsicState = 100;
$flA = $factory->getFlyweight('a');
$flA->operation(--$extrinsicState);

$flB = $factory->getFlyweight('b');
$flB->operation(--$extrinsicState);

$flC = $factory->getFlyweight('c');
$flC->operation(--$extrinsicState);

$flD = new UnsharedConcreteFlyweight();
$flD->operation(--$extrinsicState);

L'appel client permet de partager l'état externe $extrinsicState entre chaque objet

  • C'est un peu intéressant, ce mode La quantité de code n'est pas petite
  • Lorsqu'une application utilise un grand nombre d'objets très similaires et que la plupart des états des objets peuvent être modifiés en états externes, il est très approprié pour le Modèle de poids mouche
  • L'usine stocke ici une liste d'objets, et non les objets sont créés comme des méthodes d'usine ou des usines abstraites. Bien que la création soit également effectuée ici, si l'objet existe, il sera renvoyé directement et la liste est toujours maintenue
  • . Mode Flyweight En réalité, tout le monde doit l'avoir utilisé dans une certaine mesure. Diverses technologies de pool sont ses applications typiques : pool de threads, pool de connexions, etc. Les deux autres types String identiques peuvent être === en PHP ou Java. au mode poids mouche. Ils sont connectés. Les adresses mémoires sont toutes les mêmes. N'est-ce pas une sorte de partage ? Concernant le mode poids mouche, il y a un exemple extrêmement classique, qui est bien meilleur que l'exemple ci-dessous, et c'est à peu près ça. la carte Go. Go n'a que deux couleurs : le noir et le blanc, donc deux objets suffisent. Et ensuite ? Changez simplement leur statut de localisation ! Les amis intéressés peuvent le rechercher !
  • Le conteneur IoC dans Laravel peut être considéré comme une implémentation du modèle flyweight. Il enregistre l'objet dans un tableau et le récupère via le mécanisme de fermeture si nécessaire. Certaines classes partagent également certains attributs d'état. Vous pouvez regarder le code pour comprendre.
Parlons du fait que la technologie repose sur le changement de coque. Après tout, tout le monde aime toujours les téléphones portables de différentes couleurs pour montrer sa personnalité. Comme je l’ai déjà dit, si nous devions construire une ligne de production pour chaque couleur, cela ne représenterait-il pas un investissement énorme ? Heureusement, notre usine (Xiangyuan Factory) ne produit que la coque de fond (objet) la plus basique pour chaque modèle, puis elle est colorée via une ligne d'impression spéciale (changement d'état) ! Eh bien, le prochain Iphone nous imitera tôt ou tard. Il semble que nous devions d'abord collecter toutes sortes d'or et diverses couleurs riches. Peut-être pouvons-nous aussi invoquer le dragon ! !

Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php

Exemple

Comme prévu, nous sommes là quand même Envoi messages texte, cette fois, les messages texte sont toujours envoyés via Alibaba Cloud et Jiguang SMS, mais cette fois, nous utilisons le mode poids mouche pour l'implémenter. Dans l'usine poids mouche ici, nous enregistrons deux types d'objets différents, via des états internes et externes. Qu'ils soient en constante évolution !

Diagramme des classes d'envoi de SMS

Découvrez le modèle de poids mouche en PHP dans un article

Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights-message.php

<?php

interface Message
{
    public function send(User $user);
}

class AliYunMessage implements Message
{
    private $template;
    public function __construct($template)
    {
        $this->template = $template;
    }
    public function send(User $user)
    {
        echo &#39;使用阿里云短信向&#39; . $user->GetName() . &#39;发送:&#39;;
        echo $this->template->GetTemplate(), PHP_EOL;
    }
}

class JiGuangMessage implements Message
{
    private $template;
    public function __construct($template)
    {
        $this->template = $template;
    }
    public function send(User $user)
    {
        echo &#39;使用极光短信向&#39; . $user->GetName() . &#39;发送:&#39;;
        echo $this->template->GetTemplate(), PHP_EOL;
    }
}

class MessageFactory
{
    private $messages = [];
    public function GetMessage(Template $template, $type = &#39;ali&#39;)
    {
        $key = md5($template->GetTemplate() . $type);
        if (!key_exists($key, $this->messages)) {
            if ($type == &#39;ali&#39;) {
                $this->messages[$key] = new AliYunMessage($template);
            } else {
                $this->messages[$key] = new JiGuangMessage($template);
            }
        }
        return $this->messages[$key];
    }

    public function GetMessageCount()
    {
        echo count($this->messages);
    }
}

class User
{
    public $name;
    public function GetName()
    {
        return $this->name;
    }
}

class Template
{
    public $template;
    public function GetTemplate()
    {
        return $this->template;
    }
}

// 内部状态
$t1 = new Template();
$t1->template = &#39;模板1,不错哟!&#39;;

$t2 = new Template();
$t2->template = &#39;模板2,还好啦!&#39;;

// 外部状态
$u1 = new User();
$u1->name = &#39;张三&#39;;

$u2 = new User();
$u2->name = &#39;李四&#39;;

$u3 = new User();
$u3->name = &#39;王五&#39;;

$u4 = new User();
$u4->name = &#39;赵六&#39;;

$u5 = new User();
$u5->name = &#39;田七&#39;;

// 享元工厂
$factory = new MessageFactory();

// 阿里云发送
$m1 = $factory->GetMessage($t1);
$m1->send($u1);

$m2 = $factory->GetMessage($t1);
$m2->send($u2);

echo $factory->GetMessageCount(), PHP_EOL; // 1

$m3 = $factory->GetMessage($t2);
$m3->send($u2);

$m4 = $factory->GetMessage($t2);
$m4->send($u3);

echo $factory->GetMessageCount(), PHP_EOL; // 2

$m5 = $factory->GetMessage($t1);
$m5->send($u4);

$m6 = $factory->GetMessage($t2);
$m6->send($u5);

echo $factory->GetMessageCount(), PHP_EOL; // 2

// 加入极光
$m1 = $factory->GetMessage($t1, &#39;jg&#39;);
$m1->send($u1);

$m2 = $factory->GetMessage($t1);
$m2->send($u2);

echo $factory->GetMessageCount(), PHP_EOL; // 3

$m3 = $factory->GetMessage($t2);
$m3->send($u2);

$m4 = $factory->GetMessage($t2, &#39;jg&#39;);
$m4->send($u3);

echo $factory->GetMessageCount(), PHP_EOL; // 4

$m5 = $factory->GetMessage($t1, &#39;jg&#39;);
$m5->send($u4);

$m6 = $factory->GetMessage($t2, &#39;jg&#39;);
$m6->send($u5);

echo $factory->GetMessageCount(), PHP_EOL; // 4

Explication

Le code est un peu trop long, mais en fait il existe deux types de classes et quatre types d'objets sont générés. Différents objets de chaque classe sont ici distingués en fonction de modèles. Cette combinaison est assez pratique. Combinez-la avec d'autres modes pour optimiser l'usine, vous pouvez y penser !
  • Le mode Flyweight convient aux scénarios dans lesquels il existe un grand nombre d'objets similaires dans le système et où un pool de mémoire tampon est requis. Il peut réduire l'utilisation de la mémoire et améliorer l'efficacité, mais il augmentera la complexité et nécessitera le partage des états internes et externes. la principale caractéristique est qu'il y a un Logo unique, lorsque l'objet existe déjà dans la mémoire, l'objet est renvoyé directement sans le recréer
  • Adresse originale : https://juejin.cn/post/6844903965814259726
  • Auteur : Chef de projet hardcore
  • 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