仲介モデルとは何ですか?
メディエーター パターンは、相互に直接対話することなく、同様のオブジェクトのコレクションへの変更を送信または仲介できるオブジェクトを開発するために使用されます。一般に、同期を維持する必要がある類似のプロパティを持つ非結合オブジェクトを扱う場合、最良のアプローチはメディエーター パターンです。 PHP ではあまり一般的に使用されないデザイン パターン。
モデルの動機:
1. ユーザー同士が直接チャットする設計スキームでは、ユーザーオブジェクト間に強い相関関係があり、システム内で以下の問題が発生します:
システム構造が複雑: 多数の相互関係と呼び出しが存在します。1 つのオブジェクトが変更されると、そのオブジェクトに関連付けられた他のすべてのオブジェクトを追跡し、適切に処理する必要があります。
2. オブジェクトの再利用性が低い: オブジェクトは他のオブジェクトと強い関係を持っているため、他のオブジェクトのサポートがなければ、オブジェクトを別のシステムやモジュールで再利用することは困難です。責任が混乱する。
3. システムのスケーラビリティが低い: 新しいオブジェクトを追加するには、元の関連オブジェクトへの参照を追加する必要があり、新しい参照関係を追加するには、元のオブジェクトの調整も必要になります。システムの結合が非常に高く、オブジェクトの操作が非常に柔軟性に欠け、スケーラビリティが非常に低いです。貧しい。
4. オブジェクト指向ソフトウェアの設計と開発プロセスでは、「単一責任原則」に従って、オブジェクトが単一の責任のみを担当するか、単一の責任を示すようにオブジェクトを改良するように努めるべきです。
5. モジュールの場合、多くのオブジェクトで構成され、これらのオブジェクト間に相互参照が存在する場合があります。2 つのオブジェクト間の複雑な参照関係を軽減し、疎結合システムにするために、中間メディエーター モデル、これはメディエーター モデルのモデル動機です。
UML
この UML 図は、メディエーター設計パターンを使用したクラス設計を示しています
以下は、上の図の説明です:
1. 図には、MyObjectA と MyObjectB という 2 つの類似したクラスがあります。 。両方のクラスの外観は同じです。それらの違いは、プライベート変数識別子によって表される識別子である可能性があります。さらに、すべての機能は類似しています。
2. オブジェクトの作成中に、MyObjectMediator のインスタンスが内部に保存されます。その後、パブリック メソッド cahngeIdentifier() を呼び出してオブジェクトの変更が要求された場合、プライベート識別子文字列を更新することでパラメータ newID をオブジェクトに適用できます。次に、保護されたメソッドnotifyMediator()を呼び出して、他のオブジェクトにメディエーションを適用します。
3.MyObjectMediator は一連のオブジェクトの中心です。これらのオブジェクトは、配列 MyObjectsToMediate に格納されます。 MyObjectsToMediate は、通知を受信すると myObjectChanged() メソッドを実行します。このメソッドは、配列 MyObjectsToMediate を解析し、指定された変更を他のすべてのオブジェクトに適用します。
中間オブジェクトを使用して一連のオブジェクトの対話をカプセル化します。これにより、各オブジェクトが相互に明示的に参照する必要がなくなり、疎結合になり、オブジェクト間の対話を独立して変更できます
<?php /** * 中介者模式 * * 用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ abstract class Mediator { abstract public function send($message,$colleague); } abstract class Colleague { private $_mediator = null; public function Colleague($mediator) { $this->_mediator = $mediator; } public function send($message) { $this->_mediator->send($message,$this); } abstract public function notify($message); } class ConcreteMediator extends Mediator { private $_colleague1 = null; private $_colleague2 = null; public function send($message,$colleague) { if($colleague == $this->_colleague1) { $this->_colleague1->notify($message); } else { $this->_colleague2->notify($message); } } public function set($colleague1,$colleague2) { $this->_colleague1 = $colleague1; $this->_colleague2 = $colleague2; } } class Colleague1 extends Colleague { public function notify($message) { echo "Colleague1 Message is :".$message."<br/>"; } } class Colleague2 extends Colleague { public function notify($message) { echo "Colleague2 Message is :".$message."<br/>"; } } // $objMediator = new ConcreteMediator(); $objC1 = new Colleague1($objMediator); $objC2 = new Colleague2($objMediator); $objMediator->set($objC1,$objC2); $objC1->send("to c2 from c1"); $objC2->send("to c1 from c2");
以上がPHP オブジェクト指向の高度な設計パターン: Mediator パターンの使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。