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+ajax 无刷新删除数据
Feb 20 PHP
让codeigniter与swfupload整合的最佳解决方案
Jun 12 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
支持png透明图片的php生成缩略图类分享
Feb 08 PHP
PHP pear安装配置教程
May 14 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 PHP
php7中停止php-fpm服务的方法详解
May 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
第三章 php操作符与控制结构代码
2011/12/30 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
python使用pymysql实现操作mysql
2016/09/13 Python
mac系统安装Python3初体验
2018/01/02 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
基于python实现查询ip地址来源
2020/06/02 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Delphi工程师笔试题
2013/09/21 面试题
仓库管理专业个人的自我评价
2013/12/30 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
英语故事演讲稿
2014/04/29 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
报名委托书
2015/01/29 职场文书
小学教师工作总结2015
2015/04/07 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
品德与社会教学反思
2016/02/24 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
Android存储中最基本的文件存储方式
2022/04/30 Java/Android