In the previous article "Understanding the Flyweight Mode in PHP" we introduced the Flyweight Mode in PHP. This article will take you to understand the combination mode in PHP design patterns.
Flat management is popular in Internet companies, that is, the management level should be less than or no more than three levels. As a low-level code farmer, your CEO and your rank are also The difference is within 3 layers. However, many traditional enterprises have very deep hierarchical relationships. From a data structure perspective, this organizational structure grouped by function is very much like a tree. The combination model we introduced today is very similar to the model at the enterprise organizational structure level.
GoF definition: combine objects into a tree structure to represent a "part-whole" hierarchy. Composite enables users to use single objects and composite objects consistently
GoF Class Diagram
Code implementation
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); }
The abstracted composite node declaration implements the default behavior of the public interface of all classes where appropriate and is the parent class of all child nodes.
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]; } }
Specific node implementation class, saves references to subordinate nodes, and defines actual node behavior.
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, the final node without child nodes.
Continue at the end of the article As an example at the beginning, in our organizational structure, when a task reaches the lowest person, it will go through multiple levels. I still prefer the traditional corporate management method. Usually one director corresponds to multiple supervisors, one supervisor corresponds to multiple managers, one manager corresponds to multiple team leaders, and one team leader corresponds to multiple employees. When a notice is issued, staff at each level must respond and continue to distribute the notice to subordinate employees while obtaining feedback from subordinates. In this way, we have unknowingly completed the application of the combination model in practice. Suddenly I feel great, and I feel like my life has reached its peak! !
Full code: https://github.com/zhangyue0503/designpatterns-php/blob/master/14.composite/source/composite.php
SMS SMS, we can use this function over and over again. This time is no exception. This time, the function of our website backend is to send text messages to users from different substations and from different sources. Here, we still only focus on sending text messages. We hope to give you users with different channel roles but unified behaviors. You can just send them. Such a function does not seem difficult, right?
SMS sending class diagram
Full source code: https://github.com/zhangyue0503/designpatterns-php /blob/master/14.composite/source/composite-msg.php
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();
Description
Original address: https://juejin .cn/post/6844903967407734792
Author: Hardcore Project Manager
Recommended learning: "PHP Video Tutorial"
The above is the detailed content of An in-depth analysis of the combination pattern in PHP. For more information, please follow other related articles on the PHP Chinese website!