背面にはと言った、私たちはしばしば人々のグループの外で作業し、深い接点を持ち、それは不動産業者であるされています。大学卒業後すぐに第二世代Xの好きな街に家を購入することができるカザフスタンを考慮することが私たちの範囲内ではありません。その後、なぜなら仕事の変化や生活、避けられない1年または2年または3年から5年と2000-2003の不動産エージェントを再生されますの長期レンタルの必要性、以来。私たちは、必ずしも情報の賃借人の住宅所有者を知っていない時には、住宅所有者は、すべての処理のための機関が、その私たちの情報を知りません。ここでは、機関が通信の橋となっている、実際には、このような状況は、フィールド内の住宅所有者が海外に行ったり事と家が仲介の手を完了するために管理しているようなものです。この場合と同様に、世界のコードは、メディエータ・パターンの典型的なアプリケーションです。
GoFのクラス図と説明
GoFの定義:相互に作用するオブジェクトの集合をカプセル化する調停オブジェクト。メディエータ維持は、明示的に疎結合ように、相互に参照し、そして独立の相互作用を間に変化させることができるオブジェクト
図クラスのGoF
コードの実装
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によって送信されたメッセージに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;
}
}
私たちが作る同僚や特定の実装クラスは、必ずポイントは、仲介者の特徴である、別の同僚のクラスは、知りませんでした仲介業者に知られている唯一の同僚は、双方が知っていないすべてのクラスです。
$m = new ConcreteMediator();
$c1 = new ConcreteColleague1($m);
$c2 = new ConcreteColleague2($m);
$m->colleague1 = $c1;
$m->colleague2 = $c2;
$c1->Send("吃过饭了吗?");
$c2->Send("没有呢,你打算请客?");
クライアントは、それが比較的簡単であるコール!
- このモードでは、いくつかの通信製品を行うことは非常に合う感じていないですか?このモデルは、ユーザ間のデカップリングできるようにすることですので、はい、社会的なチャット、SNS、ライブのようなので、ユーザは、すべてのユーザーを維持する必要がないことは、関連するオブジェクト、適切です
- それは間のメンテナンス多くの関係の問題を解決する方法であるので、ユーザは、関係を維持する必要はありませんので、同時に、ユーザーが変更関係にクラスを変更する必要はありませんユーザー・クラスの良いパッケージを維持しています
- しかし、メンテナンスを集中仲介はこのクラスをもたらす可能性があまりにも複雑かつ大規模であります
- したがって、このモデルは万能薬ではない、ビジネスシーンを使用する選択肢を明確にしてください
- メディエータは、通信機会の明確に定義されたが、複雑な方法でオブジェクトのセットに適用され、複数のクラスに分散の動作をカスタマイズしたいのですが、あまりにも多くの機会サブクラスを生成する必要はありません
起業家として、彼は、プロジェクト管理、プロジェクトマネージャーの重要性を理解し、多くの場面でのメディエーターの役割です。組織の観点からは、プロジェクトの最初と最後には、私は上司が特定のコードで実装されている方を心配する必要はありませんよう、私はプロジェクトマネージャーと通信しようとしています。同様に、などの財務、人事、管理、などの他の補助部門は、彼らがコードを書くつもりが、唯一のプロジェクトの状況とどのような協力する必要を理解して交換やプロジェクトマネージャに必要ている人を気にしないでください。プロジェクトチーム、人々は、書き込みのコードを実行しますか?すべてのプロジェクトマネージャは、それを修正するには、また、問題がどこにある彼に賃金や出席を与えるだろう誰が知っている必要はありません。そのため、プロジェクトの開発を担当するプロジェクトマネージャは、Mediatorパターンの典型的なアプリケーションです。私たちの携帯電話工場の開発は非常に高速である理由が、また、これらのプロジェクトマネージャのおかげで、少し行くために夜に大きな食事を食べるためにそれらを求めて~~~
完全なコード:https://github.com/zhangyue0503/designpatterns-php/blob/master/15.mediator/source/mediator.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 . '(' . $this->name . '发送)', $this);
}
public function Notify($message)
{
echo $this->name . '收到消息:' . $message, PHP_EOL;
}
}
$m = new ChatMediator();
$u1 = new ChatUser($m, '用户1');
$u2 = new ChatUser($m, '用户2');
$u3 = new ChatUser($m, '用户3');
$m->Attach($u1);
$m->Attach($u3);
$m->Attach($u2);
$u1->Send('Hello, 大家好呀!'); // 用户2、用户3收到消息
$u2->Send('你好呀!'); // 用户1、用户3收到消息
$m->Detach($u2); // 用户2退出聊天室
$u3->Send('欢迎欢迎!'); // 用户1收到消息
説明
- そこに見つからない、メディエータは、それは情報の転送によって渡される、この「チャットルーム」であります
- ここでは、ユーザーの固定数ではないので、それは自分自身に加えて、他の人がこのメッセージを受け取っている、ユーザーがメッセージを送信するときに、メンテナンスの配列です
- チャットルームユーザーが自由に出入り、正直に言うことができ、この例では、本当にああチャットアプリケーションの機能を実現するほとんどのようになっています
- ユーザーが非常に多く入ると案の定仲介モデルは$ユーザーのリストが肥大化になるだろう、しかし、通信用途のために本当に適している、ああ、これはどこの仲介モデル、上述の問題があります