PHP设计模式之调解者模式的深入解析
调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。
对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(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角色。
狼蚁网站SEO优化的代码实现了一个表单输入的过滤过程,类似于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 suesfully 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 putation 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>
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程