background image

PHP 入门:PHP 设计模式之调解者模式

本文为大家详细分析介绍 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 角色。
下面的代码实现了一个表单输入的过滤过程,类似于 Zend_Form_Element 功能。
代码如下:
 
<?php 

/** 
* AbstractColleague.