Dans l'article précédent "Comprendre le modèle de poids mouche en PHP dans un article", nous avons présenté le modèle de poids mouche en PHP. Cet article vous amènera à comprendre le modèle de combinaison dans les modèles de conception PHP.
La gestion plate est populaire dans les entreprises Internet, c'est-à-dire que le niveau de gestion doit être inférieur ou maximum à trois niveaux. En tant que codeur de bas niveau, la différence entre votre PDG et votre rang est de trois niveaux. Cependant, de nombreuses entreprises traditionnelles entretiennent des relations hiérarchiques très profondes. Du point de vue de la structure des données, cette structure organisationnelle regroupée par fonction ressemble beaucoup à un arbre. Le rôle du modèle de combinaison que nous présentons aujourd’hui est très similaire au modèle au niveau de la structure organisationnelle de l’entreprise.
Définition GoF : les objets sont combinés dans une structure arborescente pour représenter une hiérarchie "partie-tout". Composite permet aux utilisateurs d'utiliser des objets uniques et des objets composites de manière cohérente
Diagramme de classes GoF
Implémentation du code
abstract class Component { protected $name; public function __construct($name){ $this->name = $name; } abstract public function Operation(int $depth); abstract public function Add(Component $component); abstract public function Remove(Component $component); }
Déclarations de nœuds composites abstraites, implémentant toutes les classes le cas échéant Le comportement par défaut de l'interface publique est être la classe parent de tous les nœuds enfants.
class Composite extends Component { private $componentList; public function Operation($depth) { echo str_repeat('-', $depth) . $this->name . PHP_EOL; foreach ($this->componentList as $component) { $component->Operation($depth + 2); } } public function Add(Component $component) { $this->componentList[] = $component; } public function Remove(Component $component) { $position = 0; foreach ($this->componentList as $child) { ++$position; if ($child == $component) { array_splice($this->componentList, ($position), 1); } } } public function GetChild(int $i) { return $this->componentList[$i]; } }
Classe d'implémentation de nœud spécifique, enregistre les références aux nœuds subordonnés et définit le comportement réel du nœud.
class Leaf extends Component { public function Add(Component $c) { echo 'Cannot add to a leaf' . PHP_EOL; } public function Remove(Component $c) { echo 'Cannot remove from a leaf' . PHP_EOL; } public function Operation(int $depth) { echo str_repeat('-', $depth) . $this->name . PHP_EOL; } }
Leaf node, le nœud final sans nœuds enfants.
En continuant avec l'exemple au début de l'article, dans notre structure organisationnelle, lorsqu'une tâche atteint la personne la plus basse , il passera par plusieurs niveaux. Je préfère toujours la méthode traditionnelle de gestion d’entreprise. Habituellement, un directeur correspond à plusieurs superviseurs, un superviseur correspond à plusieurs managers, un manager correspond à plusieurs chefs d'équipe et un chef d'équipe correspond à plusieurs employés. Lorsqu'un avis est émis, le personnel de chaque niveau doit répondre et continuer à distribuer l'avis aux employés subalternes tout en obtenant les commentaires de ces derniers. De cette façon, nous avons, sans le savoir, achevé l’application pratique du modèle de combinaison. Soudain, je me sens bien et j'ai l'impression que ma vie a atteint son apogée ! !
Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/14.composite/source/composite.php
Messagerie texte SMS, nous pouvons utiliser cette fonction sur et encore une fois Utilisé. Cette fois ne fait pas exception. Cette fois, la fonction du backend de notre site Web est d'envoyer des messages texte aux utilisateurs de différentes sous-stations et de différentes sources. Ici, nous nous concentrons toujours uniquement sur l'envoi de messages texte. Nous espérons vous offrir des utilisateurs avec des rôles de canal différents mais des comportements unifiés. Une telle fonction ne semble pas difficile, n'est-ce pas ?
Diagramme des classes d'envoi de SMS
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/14.composite/source/composite-msg.php
<?php abstract class Role { protected $userRoleList; protected $name; public function __construct(String $name) { $this->name = $name; } abstract public function Add(Role $role); abstract public function Remove(Role $role); abstract public function SendMessage(); } class RoleManger extends Role { public function Add(Role $role) { $this->userRoleList[] = $role; } public function Remove(Role $role) { $position = 0; foreach ($this->userRoleList as $n) { ++$position; if ($n == $role) { array_splice($this->userRoleList, ($position), 1); } } } public function SendMessage() { echo "开始发送用户角色:" . $this->name . '下的所有用户短信', PHP_EOL; foreach ($this->userRoleList as $role) { $role->SendMessage(); } } } class Team extends Role { public function Add(Role $role) { echo "小组用户不能添加下级了!", PHP_EOL; } public function Remove(Role $role) { echo "小组用户没有下级可以删除!", PHP_EOL; } public function SendMessage() { echo "小组用户角色:" . $this->name . '的短信已发送!', PHP_EOL; } } // root用户 $root = new RoleManger('网站用户'); $root->add(new Team('主站用户')); $root->SendMessage(); // 社交版块 $root2 = new RoleManger('社交版块'); $managerA = new RoleManger('论坛用户'); $managerA->add(new Team('北京论坛用户')); $managerA->add(new Team('上海论坛用户')); $managerB = new RoleManger('sns用户'); $managerB->add(new Team('北京sns用户')); $managerB->add(new Team('上海sns用户')); $root2->add($managerA); $root2->add($managerB); $root2->SendMessage();
Explication
Adresse originale : https://juejin.cn. /post/6844903967407734792
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!