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实现分页
Mar 27 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
php中检查文件或目录是否存在的代码小结
Oct 22 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
ThinkPHP分页实例
Oct 15 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
THINKPHP截取中文字符串函数实例代码
Mar 20 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
php实现等比例压缩图片
Jul 26 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获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
php实现点击可刷新验证码
2015/11/07 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
php实现登陆模块功能示例
2016/10/20 PHP
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
2007/03/27 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
chrome调试javascript详解
2015/10/21 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Python中的hypot()方法使用简介
2015/05/18 Python
Python手机号码归属地查询代码
2016/05/04 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
详解python中的闭包
2020/09/07 Python
Python修改DBF文件指定列
2020/12/19 Python
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
酒店副总经理岗位职责范本
2014/02/04 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
加强作风建设心得体会
2014/10/22 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
经营场所证明范本
2015/06/19 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android