Maison > Article > développement back-end > Découvrez le modèle de poids mouche en PHP dans un article
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.
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.
Définition GoF : utiliser une technologie partagée pour prendre en charge efficacement un grand nombre d'objets à granularité fine
Diagramme de classes GoF
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
Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php
Exemple
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights-message.php
Explication<?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 '使用阿里云短信向' . $user->GetName() . '发送:'; 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 '使用极光短信向' . $user->GetName() . '发送:'; echo $this->template->GetTemplate(), PHP_EOL; } } class MessageFactory { private $messages = []; public function GetMessage(Template $template, $type = 'ali') { $key = md5($template->GetTemplate() . $type); if (!key_exists($key, $this->messages)) { if ($type == 'ali') { $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 = '模板1,不错哟!'; $t2 = new Template(); $t2->template = '模板2,还好啦!'; // 外部状态 $u1 = new User(); $u1->name = '张三'; $u2 = new User(); $u2->name = '李四'; $u3 = new User(); $u3->name = '王五'; $u4 = new User(); $u4->name = '赵六'; $u5 = new User(); $u5->name = '田七'; // 享元工厂 $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, 'jg'); $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, 'jg'); $m4->send($u3); echo $factory->GetMessageCount(), PHP_EOL; // 4 $m5 = $factory->GetMessage($t1, 'jg'); $m5->send($u4); $m6 = $factory->GetMessage($t2, 'jg'); $m6->send($u5); echo $factory->GetMessageCount(), PHP_EOL; // 4
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 !
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!