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用户指南-cookies部分
Oct 09 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
关于BIG5-HKSCS的解决方法
Mar 20 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
Jun 17 PHP
php类声明和php类使用方法示例分享
Mar 29 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
Laravel实现批量更新多条数据
Apr 06 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
数据库中排序的对比及使用条件详解
2012/02/23 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python中字符编码简介、方法及使用建议
2015/01/08 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
党章培训心得体会
2014/09/04 职场文书
稽核岗位职责
2015/02/10 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
python 解决微分方程的操作(数值解法)
2021/05/26 Python
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL