An in-depth analysis of the combination pattern in PHP
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 class diagram and explanation
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.
- From the code point of view, it is completely the implementation of a tree
- All child nodes and leaf nodes can process data, but the leaf node is the end point
- When you hope that users can ignore the difference between a composite object and a single object and use all objects in the composite structure uniformly, you should consider using the composite mode
- The user does not need to care whether to process a leaf node or a composite component , there is no need to write some selection judgment statements to define the combination
- The combination mode allows customers to use the combination structure and a single object consistently
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
Example
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
<?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();
Description
- When I want to send the user of the forum section At this time, I can freely add leaf nodes of each local station to control the sending objects
- You can regard the entire sending of $root2 as a whole, and different sections and regions as parts
- This combination can extend downward until the end of the deep leaf node. Of course, this degree is controlled by yourself, it is very clear
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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.
