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笔记之:基于面向对象设计的详解
May 14 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
PHP利用MySQL保存session的实现思路及示例代码
Sep 09 PHP
smarty简单分页的实现方法
Oct 27 PHP
php使用cookie保存登录用户名的方法
Jan 26 PHP
php通过array_shift()函数移除数组第一个元素的方法
Mar 18 PHP
php生成二维码
Aug 10 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 PHP
laravel框架使用极光推送消息操作示例
Feb 15 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和ACCESS写聊天室(五)
2006/10/09 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
php生成html文件方法总结
2014/12/01 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
js图片预加载示例
2014/04/30 Javascript
angular.bind使用心得
2015/10/26 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
python绘制简单折线图代码示例
2017/12/19 Python
python机器学习之神经网络(三)
2017/12/20 Python
python事件驱动event实现详解
2018/11/21 Python
python获取txt文件词向量过程详解
2019/07/05 Python
python Pexpect模块的使用
2020/12/25 Python
什么是唯一索引
2015/07/05 面试题
班会关于环保演讲稿
2013/12/29 职场文书
大学生水果店创业计划书
2014/01/28 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
小学语文教学随笔
2015/08/14 职场文书
汉语拼音教学反思
2016/02/22 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle
Java实现简易的分词器功能
2021/06/15 Java/Android
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python