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 相关文章推荐
MySQL相关说明
Jan 15 PHP
从一个不错的留言本弄的mysql数据库操作类
Sep 02 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
PHP实现变色验证码实例
Jan 06 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
PHP+JS实现大规模数据提交的方法
Jul 02 PHP
ThinkPHP控制器详解
Jul 27 PHP
详解PHP中的状态模式编程
Aug 11 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
PHP实时统计中文字数和区别
Feb 28 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
终于听上了直流胆调频
2021/03/02 无线电
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
jQuery 解析xml文件
2009/08/09 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
Python功能键的读取方法
2015/05/28 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
基于python实现学生管理系统
2018/10/17 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
机修工岗位职责
2013/11/24 职场文书
无工作经验者个人求职信范文
2013/12/22 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
讲座通知范文
2015/04/23 职场文书
用人单位聘用意向书
2015/05/11 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
基于Redission的分布式锁实战
2022/08/14 Redis