ホームページ  >  記事  >  バックエンド開発  >  PHP の組み合わせパターンの詳細な分析

PHP の組み合わせパターンの詳細な分析

青灯夜游
青灯夜游転載
2021-07-15 19:30:512752ブラウズ

前の記事「PHP のフライウェイト モードを理解する」では、PHP のフライウェイト モードについて紹介しましたが、この記事では、PHP デザイン パターンの組み合わせモードについて説明します。

PHP の組み合わせパターンの詳細な分析

インターネット企業ではフラット管理が一般的です。つまり、管理レベルは 3 レベル以下である必要があります。低レベルのコード ファーマーとして、CEO はあなたのランクも3階層以内の差です。ただし、従来の企業の多くは非常に深い階層関係を持っており、データ構造の観点から見ると、機能ごとにグループ化された組織構造はツリーに非常によく似ています。今回紹介した組み合わせモデルは、企業の組織構造レベルのモデルと非常によく似ています。

Gof クラス図と説明

GoF 定義: オブジェクトをツリー構造に結合して、「部分全体」の階層を表します。コンポジットにより、ユーザーは単一オブジェクトと複合オブジェクトを一貫して使用できるようになります

GoF クラス図

PHP の組み合わせパターンの詳細な分析

コードの実装

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

SMS SMS、この機能は何度でも使用できます。今回も例外ではありません。今回、Web サイトのバックエンドの機能は、さまざまな変電所やさまざまなソースからユーザーにテキスト メッセージを送信することです。ここでは、まだテキスト メッセージの送信だけに焦点を当てています。チャネルの役割は異なりますが、動作は統一されているユーザーを提供したいと考えています。メッセージを送信するだけで済みます。このような機能は難しくありませんよね?

SMS 送信クラス図

PHP の組み合わせパターンの詳細な分析

完全なソース コード: 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 . &#39;下的所有用户短信&#39;, 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 . &#39;的短信已发送!&#39;, PHP_EOL;
    }
}

// root用户
$root = new RoleManger(&#39;网站用户&#39;);
$root->add(new Team(&#39;主站用户&#39;));
$root->SendMessage();

// 社交版块
$root2 = new RoleManger(&#39;社交版块&#39;);
$managerA = new RoleManger(&#39;论坛用户&#39;);
$managerA->add(new Team(&#39;北京论坛用户&#39;));
$managerA->add(new Team(&#39;上海论坛用户&#39;));

$managerB = new RoleManger(&#39;sns用户&#39;);
$managerB->add(new Team(&#39;北京sns用户&#39;));
$managerB->add(new Team(&#39;上海sns用户&#39;));

$root2->add($managerA);
$root2->add($managerB);
$root2->SendMessage();

Description

ユーザーを送信したい場合このとき、各ローカル局のリーフノードを自由に追加して送信オブジェクトを制御することができます。
  • $root2 の送信全体を全体として、さまざまなセクションや領域を部分として考えることができます
  • この組み合わせは、深い葉ノードの終わりまで下方向に拡張できます。もちろん、この程度は自分で制御できます。非常に明確です。
元のアドレス: https: //juejin .cn/post/6844903967407734792

著者: ハードコア プロジェクト マネージャー

推奨学習: 「
PHP ビデオ チュートリアル

以上がPHP の組み合わせパターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。