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项目打包方法
Feb 18 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
php基于session实现数据库交互的类实例
Aug 03 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
PHP写的简单数字验证码实例
May 23 PHP
PHP异步进程助手async-helper
Feb 05 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 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数据访问之增删改查操作
2016/05/09 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
JavaScript如何操作css
2020/10/24 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
python中函数传参详解
2016/07/03 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
详解Python3 基本数据类型
2019/04/19 Python
python中web框架的自定义创建
2019/09/08 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
医学院学生求职简历的自我评价
2013/10/24 职场文书
中学生差生评语
2014/01/30 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
2014年校长工作总结
2014/12/11 职场文书
颐和园英文导游词
2015/01/30 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js