PHP設(shè)計(jì)模式之調(diào)解者模式的深入解析
調(diào)解者模式,這個(gè)模式的目的是封裝一組對象之間的相互作用,防止對象之間相互干擾,調(diào)解者(Mediator)在同事對象(Colleague)之間充當(dāng)中間匯聚點(diǎn)。同事對象之間應(yīng)該保持松散耦合,避免一個(gè)對象直接明確指向另一個(gè)對象。在調(diào)解者模式下,對象的關(guān)系和依賴發(fā)生沖突時(shí),我們可以使用調(diào)解者在耦合的對象之間協(xié)調(diào)工作流,依賴可以從同事朝調(diào)解者或從調(diào)解者向同事建立,這兩個(gè)方向上的依賴都可以使用AbstractColleague或AbstractMediator中斷。
對象不是孤立的,對象之間必須相互協(xié)作才能完成任務(wù)。雖然調(diào)解者模式可以限制對象之間的相互作用,但如果濫用,會致使編寫聚合性類變得非常困難。舉一個(gè)實(shí)用的例子,在領(lǐng)域驅(qū)動設(shè)計(jì)(Domain-Driven Design)中的服務(wù)就是實(shí)體之間的調(diào)解者。再舉一個(gè)PHP相關(guān)的例子,Zend_Form裝飾和過濾功能實(shí)際上可以看作是Zend_Form_Decorator和Zend_Filter實(shí)例之間的一個(gè)簡單調(diào)解者,它們都使用Zend_Validate對象進(jìn)行驗(yàn)證。
當(dāng)調(diào)解者必須監(jiān)聽同事對象的事件時(shí),它通常是作為觀察者(Observer)實(shí)現(xiàn)的,產(chǎn)生一個(gè)黑板(blackboard)對象,一些同事寫,另一些同事就讀。來自同事的事件被推向調(diào)解者,再由調(diào)解者將其轉(zhuǎn)發(fā)給其它訂閱的同事,同事之間不需要相互了解,這個(gè)架構(gòu)成功用于隨Zend框架發(fā)布的Dojo JavaScript庫。這個(gè)模式的另一個(gè)好處是對象的變化包含在計(jì)算方法中,可以通過配置不同的調(diào)解者實(shí)現(xiàn)這一目標(biāo),但實(shí)例化相關(guān)對象將是一個(gè)松散的操作,不同容器和工廠之間的協(xié)作關(guān)系將是分散的。
參與者:
◆同事(Colleague):重點(diǎn)是它的職責(zé),它只與一個(gè)調(diào)解者M(jìn)ediator或AbstractMediator通信。
◆調(diào)解者(Mediator):協(xié)同多個(gè)Colleagues(AbstractColleagues)共同工作。
◆AbstractMediator,AbstractColleague:從這些角色的真實(shí)實(shí)現(xiàn)解耦的可選接口,可能不止一個(gè)AbstractColleague角色。
下面的代碼實(shí)現(xiàn)了一個(gè)表單輸入的過濾過程,類似于Zend_Form_Element功能。
<?php
/**
* AbstractColleague.
*/
interface Filter
{
public function filter($value);
}
/**
* Colleague. We decide in the implementation phase
* that Colleagues should not know the next Colleague
* in the chain, resorting to a Mediator to link them together.
* This choice succesfully avoids a base abstract class
* for Filters.
* Remember that this is an example: it is not only
* Chain of Responsibility that can be alternatively implemented
* as a Mediator.
*/
class TrimFilter implements Filter
{
public function filter($value)
{
return trim($value);
}
} <PRE class=php name="code"> /**
* Colleague.
*/
class NullFilter implements Filter
{
public function filter($value)
{
return $value ? $value : '';
}
}
/**
* Colleague.
*/
class HtmlEntitiesFilter implements Filter
{
public function filter($value)
{
return htmlentities($value);
}
}
</PRE><PRE class=php name="code"> /**
* 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 $_filters;
protected $_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";
</PRE>
<PRE></PRE>
- PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
- php設(shè)計(jì)模式之命令模式使用示例
- php設(shè)計(jì)模式之單例模式使用示例
- php設(shè)計(jì)模式之單例、多例設(shè)計(jì)模式的應(yīng)用分析
- PHP設(shè)計(jì)模式之迭代器模式的深入解析
- PHP設(shè)計(jì)模式之解釋器模式的深入解析
- PHP設(shè)計(jì)模式之代理模式的深入解析
- PHP設(shè)計(jì)模式之責(zé)任鏈模式的深入解析
- PHP設(shè)計(jì)模式之結(jié)構(gòu)模式的深入解析
- PHP設(shè)計(jì)模式之命令模式的深入解析
- php設(shè)計(jì)模式之簡單工廠模式詳解
相關(guān)文章
php正則提取html圖片(img)src地址與任意屬性的方法
下面小編就為大家?guī)硪黄猵hp正則提取html圖片(img)src地址與任意屬性的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
關(guān)于PHP結(jié)束標(biāo)簽的使用細(xì)節(jié)探討及聯(lián)想
PHP解析文件時(shí)會尋找開始?php和結(jié)束標(biāo)記?,標(biāo)記告訴PHP開始和停止解釋其中的代碼,接下來將詳細(xì)介紹下PHP結(jié)束標(biāo)簽的使用細(xì)節(jié)感興趣的你可以參考下本文或許可以幫助到你2013-03-03
php數(shù)組函數(shù)序列之a(chǎn)rray_unique() - 去除數(shù)組中重復(fù)的元素值
array_unique() 函數(shù)移除數(shù)組中的重復(fù)的值,并返回結(jié)果數(shù)組。 當(dāng)幾個(gè)數(shù)組元素的值相等時(shí),只保留第一個(gè)元素,其他的元素被刪除。2011-10-10
php array_unique之后json_encode需要注意
php array_unique之后json_encode需要注意的地方,需要的朋友可以參考下。2011-01-01
PHP 獲取文件路徑(靈活應(yīng)用__FILE__)
__FILE__ ,是返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個(gè)絕對路徑,而在此之前的版本有時(shí)會包含一個(gè)相對路徑2013-02-02
PHP 優(yōu)化配置——加速你的VBB,phpwind,Discuz,IPB,MolyX
PHP 優(yōu)化配置——加速你的VBB,phpwind,Discuz,IPB,MolyX...2007-07-07
關(guān)于更改Zend Studio/Eclipse代碼風(fēng)格主題的介紹
本篇文章是對關(guān)于更改Zend Studio/Eclipse代碼風(fēng)格主題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP中date()日期函數(shù)有關(guān)參數(shù)整理
PHP中date()日期函數(shù)有關(guān)參數(shù)整理,需要的朋友可以參考下。2011-07-07
php實(shí)現(xiàn) data url的圖片生成與保存
本文給大家介紹的是使用php實(shí)現(xiàn)的data url格式圖片的生成與保存,非常的簡單實(shí)用,有需要的小伙伴可以參考下2016-12-12

