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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
PHP+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
May 15 PHP
php并发对MYSQL造成压力的解决方法
Feb 21 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
php简单备份与还原MySql的方法
May 09 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
tensorflow实现简单逻辑回归
2018/09/07 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Python绘制数码晶体管日期
2021/02/19 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
介绍一下Java中的static关键字
2012/05/12 面试题
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
中专毕业生的自我鉴定
2013/12/01 职场文书
怎样写好自荐信和推荐信
2013/12/26 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
酒鬼酒广告词
2014/03/21 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python
Python使用Web框架Flask开发项目
2022/06/01 Python