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 Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

微信勿擾模式什麼意思如今,隨著智慧型手機的普及和行動網路的快速發展,社群媒體平台已成為人們日常生活中不可或缺的一部分。而微信作為國內最受歡迎的社群媒體平台之一,幾乎每個人都有一個微信帳號。我們可以透過微信與朋友、家人、同事進行即時溝通,分享生活中的點滴,了解彼此的近況。然而,在這個時代,我們也不可避免地面臨資訊過載和隱私洩漏的問題,特別是對於那些需要專注或

長期以來,iOS設備一直能夠使用「健康」應用程式追蹤您的睡眠模式等。但是,當您在睡覺時被通知打擾時,這不是很煩人嗎?這些通知可能無關緊要,因此在此過程中會擾亂您的睡眠模式。雖然免打擾模式是避免睡覺時分心的好方法,但它可能會導致您錯過夜間收到的重要電話和訊息。值得慶幸的是,這就是睡眠模式的用武之地。讓我們了解更多關於它以及如何在iPhone上使用它的資訊。睡眠模式在iPhone上有什麼作用睡眠模式是iOS中專用的專注模式,會根據你在「健康」App中的睡眠定時自動啟動。它可以幫助您設定鬧鐘,然後可以

JSON(JavaScriptObjectNotation)是一種輕量級的資料交換格式,已成為Web應用程式之間資料交換的常用格式。 PHP的json_encode()函數可以將陣列或物件轉換為JSON字串。本文將介紹如何使用PHP的json_encode()函數,包括語法、參數、傳回值以及具體的範例。語法json_encode()函數的語法如下:st

即使在「請勿打擾」模式下接聽電話也可能是一種非常煩人的體驗。顧名思義,請勿打擾模式可關閉來自郵件、訊息等的所有來電通知和警報。您可以按照這些解決方案集進行修復。修復1–啟用對焦模式在手機上啟用對焦模式。步驟1–從頂部向下滑動以存取控制中心。步驟2–接下來,在手機上啟用「對焦模式」。專注模式可在手機上啟用「請勿打擾」模式。它不會讓您的手機上出現任何來電提醒。修復2–更改對焦模式設定如果對焦模式設定中存在一些問題,則應進行修復。步驟1–打開您的iPhone設定視窗。步驟2–接下來,開啟「對焦」模式設

在iPhone15Pro和iPhone15ProMax型號上,Apple推出了一個實體可編程的動作按鈕,取代了音量按鈕上方的傳統響鈴/靜音開關。可以對操作按鈕進行編程以執行幾種不同的功能,但是在靜音和響鈴模式之間切換的能力並沒有消失。預設情況下,長按一次操作按鈕將使裝置靜音,按鈕的觸覺回饋將發出三個脈衝。兩款iPhone15Pro機型在狀態欄中的時間旁邊都會顯示一個劃掉的鈴鐺符號,表示靜音/靜音模式已激活,並且它將一直保持到您再次長按“操作”按鈕取消設備靜音。如果您傾向於將iPhone置於靜音模

記事本++暗模式v8.0沒有參數,Notepad++是最有用的文字編輯器。在Windows10上執行的每個應用程式都支援暗模式。您可以命名網頁瀏覽器,例如Chrome、Firefox和MicrosoftEdge。如果您在記事本++上工作,預設的白色背景可能會傷害您的眼睛。開發人員已將暗模式加入到版本8的Notepad++中,這是開啟它的方法。為Windows11/10啟用記事本++暗模式啟動記事本++點選「設定」>「首選項」>「暗模式」選擇「啟用深色模式」重新啟動記

S模式下的視窗旨在透過僅允許從Microsoft應用商店安裝應用程式來提供增強的安全性和效能。雖然此功能有助於防止惡意軟體和確保安全的運算環境,但它可能會限制想要從MicrosoftStore以外的來源安裝應用程式的使用者。如果您發現自己處於這種情況並不斷問自己如何在Windows10/11中切換出S模式,那麼您來對地方了,因為我們將引導您完成如何使用兩種不同的方法在Windows10/11中切換出S模式的步驟,確保您可以享受從您選擇的任何地方安裝應用程式的自由。了解如何在Windows中切換出S模式將

待機模式即將透過iOS17進入iPhone,本指南旨在向您展示如何在iPhone上使用此功能。待機模式是一項突破性功能,可將iPhone轉換為動態、始終開啟的智慧顯示器。當您的iPhone在充電過程中水平側放時,它會啟動待機模式。此模式精美地展示了大量有用的小部件,包括但不限於當前時間、當地天氣更新、您喜歡的照片的幻燈片,甚至是音樂播放控制。此模式的一個顯著優點是它能夠顯示通知,允許用戶查看和參與通知,而無需完全喚醒他們的iPhone。如何使用待機模式要使待機模式正常運行,iPhone必須運行i
