PHP设计模式漫谈之调解者模式_PHP
我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。
同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。
图1 调解者和同事对象
对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(Domain-Driven Design)中的服务就是实体之间的调解者。再举一个PHP相关的例子,Zend_Form装饰和过滤功能实际上可以看作是Zend_Form_Decorator和Zend_Filter实例之间的一个简单调解者,它们都使用Zend_Validate对象进行验证。
当调解者必须监听同事对象的事件时,它通常是作为观察者(Observer)实现的,产生一个黑板(blackboard)对象,一些同事写,另一些同事就读。来自同事的事件被推向调解者,再由调解者将其转发给其它订阅的同事,同事之间不需要相互了解,这个架构成功用于随Zend框架发布的Dojo JavaScript库。这个模式的另一个好处是对象的变化包含在计算方法中,可以通过配置不同的调解者实现这一目标,但实例化相关对象将是一个松散的操作,不同容器和工厂之间的协作关系将是分散的。参与者:
◆同事(Colleague):重点是它的职责,它只与一个调解者Mediator或AbstractMediator通信。
◆调解者(Mediator):协同多个Colleagues(AbstractColleagues)共同工作。
◆AbstractMediator,AbstractColleague:从这些角色的真实实现解耦的可选接口,可能不止一个AbstractColleague角色。
下面的代码实现了一个表单输入的过滤过程,类似于Zend_Form_Element功能。
<ol class="dp-xml"> <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li> <li><span>/** </span></li> <li class="alt"><span> * AbstractColleague. </span></li> <li><span> */ </span></li> <li class="alt"><span>interface Filter </span></li> <li><span>{ </span></li> <li class="alt"><span> public function filter($value); </span></li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li><span>/** </span></li> <li class="alt"><span> * Colleague. We decide in the implementation phase </span></li> <li><span> * that Colleagues should not know the next Colleague </span></li> <li class="alt"><span> * in the chain, resorting to a Mediator to link them together. </span></li> <li><span> * This choice succesfully avoids a base abstract class </span></li> <li class="alt"><span> * for Filters. </span></li> <li><span> * Remember that this is an example: it is not only </span></li> <li class="alt"><span> * Chain of Responsibility that can be alternatively implemented </span></li> <li><span> * as a Mediator. </span></li> <li class="alt"><span> */ </span></li> <li><span>class TrimFilter implements Filter </span></li> <li class="alt"><span>{ </span></li> <li><span> public function filter($value) </span></li> <li class="alt"><span> { </span></li> <li><span> return trim($value); </span></li> <li class="alt"><span> } </span></li> <li><span>} </span></li> </ol>
<ol class="dp-xml"> <li class="alt"><span><span>/** </span></span></li> <li><span> * Colleague. </span></li> <li class="alt"><span> */ </span></li> <li><span>class NullFilter implements Filter </span></li> <li class="alt"><span>{ </span></li> <li><span> public function filter($value) </span></li> <li class="alt"><span> { </span></li> <li><span> return $value ? $value : ''; </span></li> <li class="alt"><span> } </span></li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li><span>/** </span></li> <li class="alt"><span> * Colleague. </span></li> <li><span> */ </span></li> <li class="alt"><span>class HtmlEntitiesFilter implements Filter </span></li> <li><span>{ </span></li> <li class="alt"><span> public function filter($value) </span></li> <li><span> { </span></li> <li class="alt"><span> return htmlentities($value); </span></li> <li><span> } </span></li> <li class="alt"><span>} </span></li> </ol>
- /**
- * The Mediator. We avoid referencing it from ConcreteColleagues
- * and so the need for an interface. We leave the implementation
- * of a bidirectional channel for the Observer pattern's example.
- * This class responsibility is to store the value and coordinate
- * filters computation when they have to be applied to the value.
- * Filtering responsibilities are obviously a concern of
- * the Colleagues, which are Filter implementations.
- */
- class InputElement
- {
- protected 我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。
同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。
![]()
图1 调解者和同事对象对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(Domain-Driven Design)中的服务就是实体之间的调解者。再举一个PHP相关的例子,Zend_Form装饰和过滤功能实际上可以看作是Zend_Form_Decorator和Zend_Filter实例之间的一个简单调解者,它们都使用Zend_Validate对象进行验证。
当调解者必须监听同事对象的事件时,它通常是作为观察者(Observer)实现的,产生一个黑板(blackboard)对象,一些同事写,另一些同事就读。来自同事的事件被推向调解者,再由调解者将其转发给其它订阅的同事,同事之间不需要相互了解,这个架构成功用于随Zend框架发布的Dojo JavaScript库。这个模式的另一个好处是对象的变化包含在计算方法中,可以通过配置不同的调解者实现这一目标,但实例化相关对象将是一个松散的操作,不同容器和工厂之间的协作关系将是分散的。参与者:
◆同事(Colleague):重点是它的职责,它只与一个调解者Mediator或AbstractMediator通信。
◆调解者(Mediator):协同多个Colleagues(AbstractColleagues)共同工作。
◆AbstractMediator,AbstractColleague:从这些角色的真实实现解耦的可选接口,可能不止一个AbstractColleague角色。
下面的代码实现了一个表单输入的过滤过程,类似于Zend_Form_Element功能。
<ol class="dp-xml"> <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li> <li><span>/** </span></li> <li class="alt"><span> * AbstractColleague. </span></li> <li><span> */ </span></li> <li class="alt"><span>interface Filter </span></li> <li><span>{ </span></li> <li class="alt"><span> public function filter($value); </span></li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li><span>/** </span></li> <li class="alt"><span> * Colleague. We decide in the implementation phase </span></li> <li><span> * that Colleagues should not know the next Colleague </span></li> <li class="alt"><span> * in the chain, resorting to a Mediator to link them together. </span></li> <li><span> * This choice succesfully avoids a base abstract class </span></li> <li class="alt"><span> * for Filters. </span></li> <li><span> * Remember that this is an example: it is not only </span></li> <li class="alt"><span> * Chain of Responsibility that can be alternatively implemented </span></li> <li><span> * as a Mediator. </span></li> <li class="alt"><span> */ </span></li> <li><span>class TrimFilter implements Filter </span></li> <li class="alt"><span>{ </span></li> <li><span> public function filter($value) </span></li> <li class="alt"><span> { </span></li> <li><span> return trim($value); </span></li> <li class="alt"><span> } </span></li> <li><span>} </span></li> </ol>ログイン後にコピーログイン後にコピー<ol class="dp-xml"> <li class="alt"><span><span>/** </span></span></li> <li><span> * Colleague. </span></li> <li class="alt"><span> */ </span></li> <li><span>class NullFilter implements Filter </span></li> <li class="alt"><span>{ </span></li> <li><span> public function filter($value) </span></li> <li class="alt"><span> { </span></li> <li><span> return $value ? $value : ''; </span></li> <li class="alt"><span> } </span></li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li><span>/** </span></li> <li class="alt"><span> * Colleague. </span></li> <li><span> */ </span></li> <li class="alt"><span>class HtmlEntitiesFilter implements Filter </span></li> <li><span>{ </span></li> <li class="alt"><span> public function filter($value) </span></li> <li><span> { </span></li> <li class="alt"><span> return htmlentities($value); </span></li> <li><span> } </span></li> <li class="alt"><span>} </span></li> </ol>ログイン後にコピーログイン後にコピーログイン後にコピー___FCKpd___2ログイン後にコピーログイン後にコピー原文名:Practical Php Patterns: Mediator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns
filters;- protected 我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。
同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。
![]()
图1 调解者和同事对象对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(Domain-Driven Design)中的服务就是实体之间的调解者。再举一个PHP相关的例子,Zend_Form装饰和过滤功能实际上可以看作是Zend_Form_Decorator和Zend_Filter实例之间的一个简单调解者,它们都使用Zend_Validate对象进行验证。
当调解者必须监听同事对象的事件时,它通常是作为观察者(Observer)实现的,产生一个黑板(blackboard)对象,一些同事写,另一些同事就读。来自同事的事件被推向调解者,再由调解者将其转发给其它订阅的同事,同事之间不需要相互了解,这个架构成功用于随Zend框架发布的Dojo JavaScript库。这个模式的另一个好处是对象的变化包含在计算方法中,可以通过配置不同的调解者实现这一目标,但实例化相关对象将是一个松散的操作,不同容器和工厂之间的协作关系将是分散的。参与者:
◆同事(Colleague):重点是它的职责,它只与一个调解者Mediator或AbstractMediator通信。
◆调解者(Mediator):协同多个Colleagues(AbstractColleagues)共同工作。
◆AbstractMediator,AbstractColleague:从这些角色的真实实现解耦的可选接口,可能不止一个AbstractColleague角色。
下面的代码实现了一个表单输入的过滤过程,类似于Zend_Form_Element功能。
<ol class="dp-xml"> <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li> <li><span>/** </span></li> <li class="alt"><span> * AbstractColleague. </span></li> <li><span> */ </span></li> <li class="alt"><span>interface Filter </span></li> <li><span>{ </span></li> <li class="alt"><span> public function filter($value); </span></li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li><span>/** </span></li> <li class="alt"><span> * Colleague. We decide in the implementation phase </span></li> <li><span> * that Colleagues should not know the next Colleague </span></li> <li class="alt"><span> * in the chain, resorting to a Mediator to link them together. </span></li> <li><span> * This choice succesfully avoids a base abstract class </span></li> <li class="alt"><span> * for Filters. </span></li> <li><span> * Remember that this is an example: it is not only </span></li> <li class="alt"><span> * Chain of Responsibility that can be alternatively implemented </span></li> <li><span> * as a Mediator. </span></li> <li class="alt"><span> */ </span></li> <li><span>class TrimFilter implements Filter </span></li> <li class="alt"><span>{ </span></li> <li><span> public function filter($value) </span></li> <li class="alt"><span> { </span></li> <li><span> return trim($value); </span></li> <li class="alt"><span> } </span></li> <li><span>} </span></li> </ol>ログイン後にコピーログイン後にコピー<ol class="dp-xml"> <li class="alt"><span><span>/** </span></span></li> <li><span> * Colleague. </span></li> <li class="alt"><span> */ </span></li> <li><span>class NullFilter implements Filter </span></li> <li class="alt"><span>{ </span></li> <li><span> public function filter($value) </span></li> <li class="alt"><span> { </span></li> <li><span> return $value ? $value : ''; </span></li> <li class="alt"><span> } </span></li> <li><span>} </span></li> <li class="alt"><span> </span></li> <li><span>/** </span></li> <li class="alt"><span> * Colleague. </span></li> <li><span> */ </span></li> <li class="alt"><span>class HtmlEntitiesFilter implements Filter </span></li> <li><span>{ </span></li> <li class="alt"><span> public function filter($value) </span></li> <li><span> { </span></li> <li class="alt"><span> return htmlentities($value); </span></li> <li><span> } </span></li> <li class="alt"><span>} </span></li> </ol>ログイン後にコピーログイン後にコピーログイン後にコピー___FCKpd___2ログイン後にコピーログイン後にコピー原文名:Practical Php Patterns: Mediator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns
value;- public function addFilter(Filter $filter)
- {
- $this->_filters[] = $filter;
- return $this;
- }
- public function setValue($value)
- {
- $this->_value = $this->_filter($value);
- }
- protected function _filter($value)
- {
- foreach ($this->_filters as $filter) {
- $value = $filter->filter($value);
- }
- return $value;
- }
- public function getValue()
- {
- return $this->_value;
- }
- }
- $input = new InputElement();
- $input->addFilter(new NullFilter())
- ->addFilter(new TrimFilter())
- ->addFilter(new HtmlEntitiesFilter());
- $input->setValue(' You should use the h1>-h6> tags for your headings.');
- echo $input->getValue(), "\n";
原文名:Practical Php Patterns: Mediator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











WeChat のサイレント モードとはどういう意味ですか? 現在、スマートフォンの人気とモバイル インターネットの急速な発展により、ソーシャル メディア プラットフォームは人々の日常生活に欠かせないものとなっています。 WeChat は中国で最も人気のあるソーシャル メディア プラットフォームの 1 つであり、ほとんどの人が WeChat アカウントを持っています。私たちは WeChat を通じて友人、家族、同僚とリアルタイムでコミュニケーションを取り、生活の瞬間を共有し、お互いの現在の状況を理解することができます。しかし、この時代では、特に集中力や集中力が必要な人々にとって、情報過多やプライバシー漏洩の問題にも必然的に直面します。

iOS デバイスでは、ヘルスケア アプリを使用して睡眠パターンなどを追跡できるようになってきました。でも、寝ているときに通知が来ると煩わしくありませんか?これらの通知は無関係である可能性があるため、その過程で睡眠パターンが混乱します。おやすみモードは、睡眠中に気を散らすのを避けるための優れた方法ですが、夜間に受信する重要な電話やメッセージを見逃す可能性があります。ありがたいことに、ここでスリープモードが登場します。それについてさらに詳しく、そしてiPhoneでそれを使用する方法を学びましょう。 iPhone ではスリープ モードはどのような役割を果たしますか? スリープ モードは iOS 専用のフォーカス モードで、「ヘルスケア」アプリの睡眠スケジュールに基づいて自動的に有効になります。アラームを設定するのに役立ちます。

JSON (JavaScriptObjectNotation) は、Web アプリケーション間のデータ交換の一般的な形式となっている軽量のデータ交換形式です。 PHP の json_encode() 関数は、配列またはオブジェクトを JSON 文字列に変換できます。この記事では、PHPのjson_encode()関数の構文、パラメータ、戻り値、具体的な例などの使い方を紹介します。構文 json_encode() 関数の構文は次のとおりです。

おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

iPhone 15 Pro および iPhone 15 Pro Max モデルで、Apple は、音量ボタンの上にある従来の着信音/サイレント スイッチに代わる、物理的にプログラム可能なアクション ボタンを導入しました。アクション ボタンは、いくつかの異なる機能を実行するようにプログラムできますが、サイレント モードと着信モードを切り替える機能はなくなっていません。デフォルトでは、アクション ボタンを長押しするとデバイスが沈黙し、ボタンの触覚フィードバックが 3 回脈動します。どちらの iPhone 15 Pro モデルでも、ステータス バーの時刻の横に取り消し線のベル記号が表示され、サイレント/サイレント モードが有効になっていることを示します。また、アクション ボタンを再度長押ししてデバイスのミュートを解除するまで、この状態が維持されます。 iPhoneをマナーモードにしたい場合

Notepad++ ダーク モード v8.0 にはパラメータがありません。Notepad++ は最も便利なテキスト エディタです。 Windows 10 で実行されるすべてのアプリはダーク モードをサポートしています。 Chrome、Firefox、Microsoft Edge などの Web ブラウザーに名前を付けることができます。 Notepad++ で作業している場合、デフォルトの白い背景が目を痛める可能性があります。開発者は Notepad++ のバージョン 8 にダーク モードを追加しました。これをオンにする方法は次のとおりです。 Windows 11/10 ++ ダーク モードのメモ帳を有効にする メモ帳 ++ を起動する 「設定」 > 「環境設定」 > 「ダーク モード」をクリックします 「ダーク モードを有効にする」を選択してメモ帳を再起動します

iOS17 ではスタンバイ モードが iPhone に導入されます。このガイドは、iPhone でこの機能を使用する方法を示すことを目的としています。スタンバイ モードは、iPhone をダイナミックな常時オンのスマート ディスプレイに変える画期的な機能です。充電中にiPhoneを横向きに置くとスタンバイモードになります。このモードでは、現在時刻、地域の天気予報、お気に入りの写真のスライドショー、さらには音楽再生コントロールなど、さまざまな便利なウィジェットが美しく表示されます。このモードの大きな利点は、通知を表示できることであり、ユーザーは iPhone を完全に起動しなくても通知を表示して操作できるようになります。スタンバイ モードの使用方法 スタンバイ モードが適切に機能するには、iPhone が実行されている必要があります。

Python の __contains__() 関数を使用して、オブジェクトの包含操作を定義します。Python は、さまざまな種類のデータを処理するための多くの強力な機能を提供する、簡潔で強力なプログラミング言語です。その 1 つは、__contains__() 関数を定義してオブジェクトの包含操作を実装することです。この記事では、__contains__() 関数を使用してオブジェクトの包含操作を定義する方法とサンプル コードを紹介します。 __contains__() 関数は Pytho です
