PHP の中間モデルに関する簡単な説明

青灯夜游
リリース: 2023-04-10 11:24:01
転載
2805 人が閲覧しました

前回の記事「PHP の結合モードの詳細分析」では、PHP の結合モードについて紹介しましたが、次の記事では、PHP デザイン パターンの中間モードについて説明します。

PHP の中間モデルに関する簡単な説明

前回述べたように、私たちのような外で働く人は、あるタイプの人物、つまり不動産業者と深く接触することがよくあります。大学を卒業してすぐに好きな街に家を買える第二世代X世代は検討の対象外です。家を長期間借りる必要があるため、仕事や生活の変化により必然的に1~2年、あるいは3~5年ごとに不動産屋とやり取りすることになります。私たちが家を借りるとき、私たちは家主の情報を必ずしも知っているとは限らず、家主も私たちの情報を知る必要はなく、すべて仲介業者が処理します。ここで仲介者がコミュニケーションの架け橋となるのですが、この状況は実際、住宅所有者が海外に行く、または海外で用事があり、家を完全に仲介者の手に委ねるような状況です。この状況と同様に、コードの世界でも、これはメディエーター パターンの典型的な適用例です。

Gof クラス図と説明

GoF 定義: 中間オブジェクトを使用して、一連のオブジェクトの対話をカプセル化します。メディエーターにより、オブジェクトが相互に明示的に参照する必要がなくなり、オブジェクトが疎結合になり、オブジェクト間の相互作用を独立して変更できるようになります

GoF クラス図

PHP の中間モデルに関する簡単な説明

コード実装

abstract class Mediator
{
    abstract public function Send(String $message, Colleague $colleague);
}

class ConcreteMediator extends Mediator
{
    public $colleague1;
    public $colleague2;

    public function Send(String $message, Colleague $colleague)
    {
        if ($colleague == $this->colleague1) {
            $this->colleague2->Notify($message);
        } else {
            $this->colleague1->Notify($message);
        }
    }
}
ログイン後にコピー

抽象メディエーターと具体的な実装。ここでは、2 つが固定されていると仮定します。同僚クラスを使用すると、会話できるようになります。したがって、入力する同僚が 1 の場合、2 の Notify メソッドを呼び出します。これは、2 に 1

abstract class Colleague
{
    protected $mediator;
    public function __construct(Mediator $mediator)
    {
        $this->mediator = $mediator;
    }

}

class ConcreteColleague1 extends Colleague
{
    public function Send(String $message)
    {
        $this->mediator->Send($message, $this);
    }
    public function Notify(String $message)
    {
        echo "同事1得到信息:" . $message, PHP_EOL;
    }
}

class ConcreteColleague2 extends Colleague
{
    public function Send(String $message)
    {
        $this->mediator->Send($message, $this);
    }
    public function Notify(String $message)
    {
        echo "同事2得到信息:" . $message;
    }
}
ログイン後にコピー

Colleague クラスおよび特定の実装からのメッセージを受信させるのと同じです。ここで確認する必要があるのは、次のとおりです。各同僚タイプは仲介者のみを知り、他の同僚タイプは知りません。これは仲介者の特性であり、両者はお互いを知る必要はありません。

$m = new ConcreteMediator();

$c1 = new ConcreteColleague1($m);
$c2 = new ConcreteColleague2($m);

$m->colleague1 = $c1;
$m->colleague2 = $c2;

$c1->Send("吃过饭了吗?");
$c2->Send("没有呢,你打算请客?");
ログイン後にコピー

クライアントの呼び出しは比較的簡単です。

  • このモデルは通信製品の作成に非常に適していると思いますか?はい、ソーシャル チャット、SNS、ライブ ブロードキャストなどはすべて適しています。このモデルはユーザーを相互に切り離すことができ、1 人のユーザーが関連するすべてのユーザー オブジェクトを管理する必要がないからです。
  • ユーザーはリレーションシップを維持するために必要なため、リレーションシップ間の多対多の維持の問題が解決されると同時に、リレーションシップを変更するためにユーザー クラスを変更する必要がなく、ユーザー クラスの良好なカプセル化が維持されます
  • ただし、仲介者の集中メンテナンスにより、このクラスが複雑かつ大規模になりすぎる可能性があります。
  • したがって、このモデルは万能薬ではありません。ビジネス シナリオを理解し、適切に使用する必要があります。
  • 仲介者は、グループ オブジェクトが明確に定義されているが複雑な方法で通信する場合、およびサブクラスをあまり生成せずに複数のクラスにまたがる動作をカスタマイズしたい場合に適しています

As 起業家はプロジェクト管理の重要性を知っており、プロジェクトマネージャーは多くの場面で仲介者の役割を果たします。組織的な観点から見ると、プロジェクトの開始時と終了時には、上司として誰がコーディングするかは気にする必要はなく、コミュニケーションを取りたいのはプロジェクト マネージャーだけです。同様に、他の補助部門には財務、人事、管理などが含まれます。彼らは誰がコードを書くかは気にしませんが、プロジェクトのステータスと何を調整する必要があるかを理解するためにプロジェクトマネージャーと通信するだけで済みます。プロジェクト チームの中でコードを書く人はどうでしょうか?誰が給与を支払うのか、勤怠の問題がどこにあるのかを知る必要はなく、これらはすべてプロジェクト マネージャーが解決できます。したがって、プロジェクトマネージャー責任制の下でのプロジェクト開発は、中間モデルの典型的な適用例となります。私たちの携帯電話工場がこれほど急速に発展しているのは、このプロジェクト マネージャーのおかげです。夜は彼らに豪華なディナーをごちそうしましょう~~~

コード全文: https:// github.com/zhangyue0503/designpatterns-php/blob/master/15.mediator/source/mediator.php

Example

投稿しません今回はテキストメッセージができたので、チャットルームを実装してみましょう。簡易オンライン チャット ルームの要件は、チャット ルームに入ったユーザーがオンライン チャットできるようにすることですが、このチャット ルームを仲介モードを使用して実装する方法を見てみましょう。

チャット ルーム クラスの図

PHP の中間モデルに関する簡単な説明

完全なソース コード: https://github.com/zhangyue0503/designpatterns- php /blob/master/15.mediator/source/mediator-webchat.php

<?php

abstract class Mediator
{
    abstract public function Send($message, $user);
}

class ChatMediator extends Mediator
{
    public $users = [];
    public function Attach($user)
    {
        if (!in_array($user, $this->users)) {
            $this->users[] = $user;
        }
    }

    public function Detach($user)
    {
        $position = 0;
        foreach ($this->users as $u) {
            if ($u == $user) {
                unset($this->users[$position]);
            }
            $position++;
        }
    }

    public function Send($message, $user)
    {
        foreach ($this->users as $u) {
            if ($u == $user) {
                continue;
            }
            $u->Notify($message);
        }
    }
}

abstract class User
{
    public $mediator;
    public $name;

    public function __construct($mediator, $name)
    {
        $this->mediator = $mediator;
        $this->name = $name;
    }
}

class ChatUser extends User
{
    public function Send($message)
    {
        $this->mediator->Send($message . &#39;(&#39; . $this->name . &#39;发送)&#39;, $this);
    }
    public function Notify($message)
    {
        echo $this->name . &#39;收到消息:&#39; . $message, PHP_EOL;
    }
}

$m = new ChatMediator();

$u1 = new ChatUser($m, &#39;用户1&#39;);
$u2 = new ChatUser($m, &#39;用户2&#39;);
$u3 = new ChatUser($m, &#39;用户3&#39;);

$m->Attach($u1);
$m->Attach($u3);
$m->Attach($u2);

$u1->Send(&#39;Hello, 大家好呀!&#39;); // 用户2、用户3收到消息

$u2->Send(&#39;你好呀!&#39;); // 用户1、用户3收到消息

$m->Detach($u2); // 用户2退出聊天室

$u3->Send(&#39;欢迎欢迎!&#39;); // 用户1收到消息
ログイン後にコピー

説明

  • 情報の伝達や伝達を仲介しているのがこの「チャット ルーム」であることに気づきましたか?
  • ここではユーザー数が固定ではないため、配列で保持されます。ユーザーが送信 メッセージを送信すると自分以外の全員がメッセージを受信しました
  • ユーザーは自由にチャットルームに出入りできます 正直に言うと、この例はまさに機能をほぼ実現したチャットアプリケーションのようなものです
  • 案の定、仲介モードは通信アプリケーションに非常に適しています。しかし、入力するユーザーが多すぎると、$users リストはますます肥大化してしまいます。これが前述の仲介モードです。問題

元のアドレス: https://juejin.cn/post/6844903975192363015

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

推奨調査: " PHP ビデオ チュートリアル "

以上がPHP の中間モデルに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート