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 相关文章推荐
杏林同学录(五)
Oct 09 PHP
php 无限级 SelectTree 类
May 19 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
php使用session二维数组实例
Nov 06 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
PHP Trait功能与用法实例分析
Jun 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 Session 变量的使用方法详解与实例代码
2013/09/11 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
EasyUI中的tree用法介绍
2011/11/01 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
用python代码做configure文件
2014/07/20 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
this关键字的作用
2016/01/30 面试题
交通事故协议书
2014/04/15 职场文书
质量承诺书格式
2014/05/20 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
情感电台广播稿
2015/08/18 职场文书
《观潮》教学反思
2016/02/17 职场文书
vscode中使用npm安装babel的方法
2021/08/02 Javascript