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 相关文章推荐
如何使用PHP获取网络上文件
Oct 09 PHP
支持php4、php5的mysql数据库操作类
Jan 10 PHP
php获取某个目录大小的代码
Sep 10 PHP
php 静态化实现代码
Mar 20 PHP
PHP 多维数组排序(usort,uasort)
Jun 30 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
yii用户注册表单验证实例
Dec 26 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
详解PHP PDO简单教程
May 28 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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
Banner程序
2006/10/09 PHP
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
浅析vue中常见循环遍历指令的使用 v-for
2018/04/18 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
Python中的两个内置模块介绍
2015/04/05 Python
Python中的面向对象编程详解(下)
2015/04/13 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
分享python数据统计的一些小技巧
2016/07/21 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
网络专业学生个人的自我评价
2013/12/16 职场文书
安全检查管理制度
2014/02/02 职场文书
2015年手术室工作总结
2015/05/11 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
python基础之类属性和实例属性
2021/10/24 Python
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记