ホームページ > バックエンド開発 > PHPチュートリアル > PHP デザイン パターンにおけるメディエーター パターンの詳細な分析_PHP チュートリアル

PHP デザイン パターンにおけるメディエーター パターンの詳細な分析_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:07:16
オリジナル
1049 人が閲覧しました

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 関数と同様のフォーム入力フィルタリング プロセスを実装します。

コードをコピーします コードは次のとおりです:

/** 
* 抽象的な同僚。 
    */
インターフェース Filter
{
public function filter($value); 
}

/** 
* 同僚。私たちは、実装段階
* で、同僚がチェーン内の次の同僚
* を知らないようにすることを決定し、仲介者に頼ってそれらを結び付けます。 
* この選択により、フィルターの基本抽象クラス
* が回避されます。 
* これは一例であることに注意してください:
* 責任の連鎖だけではなく、仲介者として
* を代替的に実装することもできます。 
    */
class TrimFilter は Filter を実装します
{
public function filter($value)
{
return trim($value); 
}
}
    /**  <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>



www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327553.html技術記事メディエーター パターン、このパターンの目的は、オブジェクトのグループ間の相互作用をカプセル化し、オブジェクトが相互に干渉しないようにすることです。メディエーター (Mediator) は同僚オブジェクト (Colleague) 間で機能します。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート