手机
当前位置:查字典教程网 >编程开发 >php教程 >PHP设计模式之调解者模式的深入解析
PHP设计模式之调解者模式的深入解析
摘要:调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间...

调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。

PHP设计模式之调解者模式的深入解析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功能。

复制代码 代码如下:

<?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设计模式之调解者模式的深入解析】相关文章:

PHP制作图型计数器的例子

PHP调用三种数据库的方法(2)

PHP传参之传值与传址的区别

GD输出汉字的函数的分析

PHP设计聊天室步步通

PHP设计模式之装饰者模式代码实例

PHP动态图像的创建

PHP5.0对象模型探索之抽象方法和抽象类

PHP调用三种数据库的方法(1)

PHP调用三种数据库的方法(3)

精品推荐
分类导航