Mediator パターン、このパターンの目的は、オブジェクトのグループ間の相互作用をカプセル化し、オブジェクトが相互に干渉するのを防ぐことです。Mediator (メディエーター) は、Colleague オブジェクト (Colleague) 間の中間収束点として機能します。あるオブジェクトが別のオブジェクトを直接指すことを避けるために、同僚オブジェクトは疎結合である必要があります。メディエーター モードでは、オブジェクトの関係と依存関係が競合する場合、結合されたオブジェクト間のワークフローを調整するためにメディエーターを使用できます。依存関係は同僚からメディエーターへ、またはメディエーターから同僚へ両方向に確立できます。 AbstractColleague または AbstractMediator を使用します。
オブジェクトは孤立しているのではなく、タスクを完了するには相互に協力する必要があります。メディエーター パターンはオブジェクト間の対話を制限できますが、悪用すると集約クラスの作成が非常に困難になる可能性があります。実用的な例を挙げると、ドメイン駆動設計のサービスはエンティティ間の仲介者です。別の PHP 関連の例を挙げると、Zend_Form の装飾関数とフィルタリング関数は、実際には、Zend_Form_Decorator インスタンスと Zend_Filter インスタンスの間の単純な仲介者として見ることができます。どちらも検証に Zend_Validate オブジェクトを使用します。
メディエーターが同僚オブジェクトのイベントをリッスンする必要がある場合、通常、メディエーターはオブザーバーとして実装され、一部の同僚が書き込み、他の同僚が読み取る黒板オブジェクトを生成します。同僚からのイベントはメディエーターにプッシュされ、メディエーターはそれを他のサブスクライブした同僚に転送します。このアーキテクチャーは、Zend Framework とともにリリースされた Dojo JavaScript ライブラリーで正常に使用されます。このパターンのもう 1 つの利点は、オブジェクトへの変更が計算メソッドに含まれることです。これは、さまざまなメディエーターを構成することで実現できますが、関連するオブジェクトのインスタンス化は緩やかな操作となり、さまざまなコンテナーとファクトリー間の協力関係が分散化されます。 。
参加者:
◆同僚: ポイントはその責任であり、Mediator または AbstractMediator の 1 つの仲介者とのみ通信します。
◆メディエーター:複数の同僚(AbstractColleague)と協力して仕事をします。
◆AbstractMediator、AbstractColleague: これらのロールの実際の実装から切り離されたオプションのインターフェイス。複数の AbstractColleague ロールが存在する場合があります。
次のコードは、Zend_Form_Element 関数と同様のフォーム入力フィルタリング プロセスを実装します。
/** <br> * 同僚。 <br> */ <br> class NullFilter は Filter を実装します <br> { <br> public function filter($value) <br> { <br> return $value ? $値: ''; <br> } <br> } <br><br> /** <br> * 同僚。 <br> */ <br> class HtmlEntitiesFilter は Filter を実装します <br> { <br> public function filter($value) <br> { <br> return htmlentities($value); <br> } <br> }<br>
/** <br> * 調停者。 ConcreteColleagues <br> * からの参照を避けるため、インターフェースが必要になります。双方向チャネルの実装 <br> * は、Observer パターンの例として残しておきます。 <br> * このクラスの役割は、値と座標を保存することです <br> * 値に適用する必要がある場合に計算をフィルターします。 <br> * フィルタリングの責任は明らかに <br> * フィルタの実装である同僚の懸念事項です。 <br> */ <br> class InputElement <br> { <br> protected $_filters; <br> 保護された $_value; <br><br> public function addFilter(Filter $filter) <br> { <br> $this->_filters[] = $filter; <br> $this を返します。 <br> } <br><br> パブリック関数 setValue($value) <br> { <br> $this->_value = $this->_filter($value); <br> } <br><br> 保護関数 _filter($value) <br> { <br> foreach ($this->_filters as $filter) { <br> $value = $filter->filter($value); <br> } <br> $value を返します。 <br> } <br><br> public function getValue() <br> { <br> return $this->_value; <br> } <br> } <br><br> $input = new InputElement(); <br> $input->addFilter(new NullFilter()) <br> ->addFilter(new TrimFilter()) <br> ->addFilter(new HtmlEntitiesFilter()); <br> $input->setValue(' 見出しには <h1>-<h6> タグを使用する必要があります。'); <br> echo $input->getValue(), "n";<br>