PHP设计模式之调解者模式的深入解析


Posted in PHP onJune 13, 2013

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

PHP设计模式之调解者模式的深入解析

对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(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 相关文章推荐
实现树状结构的两种方法
Oct 09 PHP
如何删除多级目录
Oct 09 PHP
php 面向对象的一个例子
Apr 12 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
Yii中的relations数据关联查询及统计功能用法详解
Jul 14 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
基于swoole实现多人聊天室
Jun 14 PHP
浅谈Laravel核心解读之Console内核
Dec 02 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 PHP
深入浅析安装PhpStorm并激活的步骤详解
Sep 17 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 #PHP
PHP设计模式之解释器模式的深入解析
Jun 13 #PHP
PHP设计模式之代理模式的深入解析
Jun 13 #PHP
PHP设计模式之责任链模式的深入解析
Jun 13 #PHP
PHP设计模式之结构模式的深入解析
Jun 13 #PHP
PHP设计模式之命令模式的深入解析
Jun 13 #PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 #PHP
You might like
在PHP中使用XML
2006/10/09 PHP
php之字符串变相相减的代码
2007/03/19 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
详解如何在angular2中获取节点
2017/11/23 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
python3中for循环踩过的坑记录
2020/12/14 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
跑操口号
2014/06/12 职场文书
药剂专业自荐书
2014/06/20 职场文书
健康状况证明模板
2014/10/23 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
js实现上传图片到服务器
2021/04/11 Javascript