PHP设计模式之调解者模式的深入解析

 更新时间:2013年06月13日 16:04:01   作者:  
本篇文章是对PHP设计模式中的调解者模式进行了详细的分析介绍,需要的朋友参考下

调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。



对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(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下载采集图片到本地的方法详解【可忽略ssl认证】

    PHP下载采集图片到本地的方法详解【可忽略ssl认证】

    这篇文章主要介绍了PHP下载采集图片到本地的方法,结合实例形式详细分析了php基于Curl远程获取远程图片资源到本地的相关操作技巧与注意事项,需要的朋友可以参考下
    2023-07-07
  • PHP转盘抽奖接口实例

    PHP转盘抽奖接口实例

    这篇文章主要介绍了PHP转盘抽奖接口的实现方法,实例分析了随机抽奖接口的实现原理与对应数据库操作的技巧,需要的朋友可以参考下
    2015-02-02
  • php树型类实例

    php树型类实例

    这篇文章主要介绍了php树型类,涉及数据结构与算法中的树结构,实例相对简单易懂,对于学习数据结构有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • CentOS系统中PHP安装扩展的方式汇总

    CentOS系统中PHP安装扩展的方式汇总

    本文给大家汇总介绍了CentOS系统中PHP安装拓展的方式,主要有 包管理式 的 yum 安装、pecl 安装,以及 源码编译安装。总结的非常全面,推荐给大家。
    2017-04-04
  • php绘制圆形的方法

    php绘制圆形的方法

    这篇文章主要介绍了php绘制圆形的方法,详细分析了php绘制图形的基本步骤与绘制圆形的实现方法,需要的朋友可以参考下
    2015-01-01
  • PHP实现约瑟夫环问题的方法分析

    PHP实现约瑟夫环问题的方法分析

    这篇文章主要介绍了PHP实现约瑟夫环问题的方法,结合实例形式分析了php使用循环与递归实现约瑟夫环的相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • PHP Web表单生成器案例分析

    PHP Web表单生成器案例分析

    这篇文章主要介绍了PHP Web表单生成器,结合具体案例形式分析了PHP Web表单生成器基本功能需求、实现方法与操作注意事项,需要的朋友可以参考下
    2020-06-06
  • 如何使用“PHP” 彩蛋进行敏感信息获取

    如何使用“PHP” 彩蛋进行敏感信息获取

    关于PHP彩蛋这个玩法已经被国外的某些Web漏洞扫描器(例如:HP WebInspect)所使用了,用其来探测被扫描的网站使用的是何种Web开发语言
    2013-08-08
  • PHP中for与foreach的区别分析

    PHP中for与foreach的区别分析

    foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误,在PHP5中也能遍历对象。
    2011-03-03
  • 启用Csrf后POST数据时出现的400错误

    启用Csrf后POST数据时出现的400错误

    这篇文章主要介绍了启用Csrf后POST数据时出现的400错误的相关资料,需要的朋友可以参考下
    2015-07-07

最新评论