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实现的MySQL数据浏览器
Mar 11 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
thinkphp模板继承实例简述
Nov 26 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
php如何实现数据库的备份和恢复
Nov 30 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文件的实现方法
2007/03/19 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
接收键盘指令的脚本
2006/06/26 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
javascript 节点排序 2
2011/01/31 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
Python里隐藏的“禅”
2014/06/16 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
客户代表实习人员自我鉴定
2013/09/27 职场文书
北京奥运会主题口号
2014/06/13 职场文书
学校开除通知书
2015/04/25 职场文书
安全生产感想
2015/08/07 职场文书
家电创业计划书
2019/08/05 职场文书
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers