前の記事「PHP のフライウェイト モードを理解する」では、PHP のフライウェイト モードについて紹介しましたが、この記事では、PHP デザイン パターンの組み合わせモードについて説明します。
インターネット企業ではフラット管理が一般的です。つまり、管理レベルは 3 レベル以下である必要があります。低レベルのコード ファーマーとして、CEO はあなたのランクも3階層以内の差です。ただし、従来の企業の多くは非常に深い階層関係を持っており、データ構造の観点から見ると、機能ごとにグループ化された組織構造はツリーに非常によく似ています。今回紹介した組み合わせモデルは、企業の組織構造レベルのモデルと非常によく似ています。
GoF 定義: オブジェクトをツリー構造に結合して、「部分全体」の階層を表します。コンポジットにより、ユーザーは単一オブジェクトと複合オブジェクトを一貫して使用できるようになります
GoF クラス図
コードの実装
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); }
抽象化された複合ノード宣言は、必要に応じてすべてのクラスのパブリック インターフェイスのデフォルトの動作を実装し、すべての子ノードの親クラスになります。
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]; } }
特定のノード実装クラス。下位ノードへの参照を保存し、実際のノードの動作を定義します。
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; } }
リーフ ノード、子ノードのない最後のノード。
続きは記事の最後に続きます 冒頭の例として、私たちの組織構造では、タスクが最下位の担当者に到達すると、複数のレベルを経由します。私は今でも伝統的な企業経営手法を好みます。通常、1 人の取締役は複数の監督者に対応し、1 人の監督者は複数のマネージャーに対応し、1 人のマネージャーは複数のチーム リーダーに対応し、1 人のチーム リーダーは複数の従業員に対応します。通知が出されると、各階層の担当者が対応し、部下のフィードバックを得ながら部下に通知を配布し続ける必要があります。このようにして、私たちは無意識のうちに組み合わせモデルの実際への適用を完了しています。突然気分が良くなり、人生のピークに達したように感じます。 !
#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/14.composite/source/composite.php# #Example
完全なソース コード: https://github.com/zhangyue0503/designpatterns- php /blob/master/14.composite/source/composite-msg.php
Description<?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();ログイン後にコピーユーザーを送信したい場合このとき、各ローカル局のリーフノードを自由に追加して送信オブジェクトを制御することができます。
元のアドレス: https: //juejin .cn/post/6844903967407734792
- $root2 の送信全体を全体として、さまざまなセクションや領域を部分として考えることができます
- この組み合わせは、深い葉ノードの終わりまで下方向に拡張できます。もちろん、この程度は自分で制御できます。非常に明確です。
PHP ビデオ チュートリアル著者: ハードコア プロジェクト マネージャー
推奨学習: 「以上がPHP の組み合わせパターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。