<html>

原文出处:blogspot

我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用。防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充其中间汇聚点。

同事对象之间应该保持松散耦合,避免一个对象直接明白指向还有一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们能够使用调解者在耦合的对象之间协调工作流。依赖能够从同事朝调解者或从调解者向同事建立。这两个方向上的依赖都能够使用AbstractColleague或AbstractMediator中断。

图1 调解者和同事对象

对象不是孤立的。对象之间必须相互协作才干完毕任务。

尽管调解者模式能够限制对象之间的相互作用,但假设滥用。会致使编写聚合性类变得很困难。举一个有用的样例,在领域驱动设计(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); 
 } 
}

/** 
 
* Colleague. 
 
*/
class NullFilter implements Filter 
{ 
 public function filter($value) 
 { 
 return $value ? $value : ''; 
 } 
} 
 
/** 
 
* Colleague. 
 
*/
class HtmlEntitiesFilter implements Filter 
{ 
 public function filter($value) 
 { 
 return htmlentities($value); 
 } 
}

/** 
 
* 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";



举报
  • 本文已收录于下面专栏:

相关文章推荐

漫谈设计模式(一)面向对象的开发过程

面向对象的开发过程 什么是对象? 在OOP的世界里,不论什么事物,无论是无形的还是有形的,都是对象,对象是包括一些属性和行为的一种组合体,它反映的是客观世界的不论什么事物,比方,马有腿、耳朵、和嘴巴等属性。它们会跑。也会嘶叫,这些是他们的行为。每一个对象都归属于某一特定的类型,比方一匹汗血宝马的类型是马。   面向对象的3个基本特征

PHP設計模式之调解者模式

这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充其中间汇聚点。

同事对象之间应该保持松散耦合,避免一个对象直接明白指...

javascript 设计模式漫谈【0】 接口类的制造

       近期在看 &lt;Javascipt Design Patterns&gt; ,虽说纯english版的看起来有点费劲伤神,但还勉强的吸取了一点知识。精神上告诉我不能太心胸狭隘。所以拿出来一点点分享吧。

还有一方面也弥补我近期一直都没有写博。          我的计划是。一步步来将这个javascript设计模式汲取而且拿出来分享。那么我们的第一站。从javascript的接口讲起。       我们的服务端代码以Java语言举例,正好,这个语言与我们的javascript语言还有历史渊源。通常java语言的接口定义应该是这样滴

设计模式22:Mediator Pattern (调解者模式)

英文原文:http://www.dofactory.com/Patterns/PatternMediator.aspx一、Mediator Pattern (调解者模式)的定义Define an ob...

PHP设计模式漫谈( 转)

转自51CTO:http://developer.51cto.com/art/201004/195765.htm PHP也有设计模式?是的。我们常常看到关于Java和.NET平台上设计模式的论述和解说。事实上,在PHP 5对面向对象的支持更加完好之后,设计模式的应用也可引入到PHP中并发挥重要作用。

<a title="

  • yd514
  • yd514
  • 2012-09-28 16:40
  • 336

PHP设计模式之调解者模式

漫谈设计模式(四)工厂(Factory)模式

[b]有类型区分的工厂模式[/b] Factory类 [code="java"] package com.model.factory; public interface Factory { int TYPE1 = 10000; int TYPE2 = 20000; int TYPE3 = 30000; int TYPE4 = 40000; int TYPE5 = 50000; Product createProduct(Integer type); } [/code] [code="java"] package c

PHP设计模式漫谈之调解者模式

调解者模式,这个模式的目的是封装一组对象之间的相互作用。防止对象之间相互干扰。调解者(Mediator)在同事对象(Colleague)之间充其中间汇聚点。

同事对象之间应该保持松散耦合,避免一个对象直...

《漫谈设计模式》一书最终出版了

  Dear my friend,   Finally, my book, “Rambling on design patterns”, has come out!   It took me more than 2 years to finish this. I’d like to thank everyone who supp
  • redhat
  • redhat
  • 2011-12-02 15:02
  • 5418

PHP设计模式漫谈之结构模式

结构模式之间有很多类似之处,由于在对象模型结构中存在几种关系:类之间的继承和实现,加上对象组合。这些是PHP设计模式的主要目的。

       对象组合的最大优势在于能够在执行时基于配置建立起一...

  • 微博
    微信
    QQ
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多仅仅同意输入30个字)

posted @ 2017-08-12 20:03  zsychanpin  阅读(159)  评论(0编辑  收藏  举报