<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个基本特征- BUYAOZAIBEIDAOLE
- 2015-10-14 11:34
- 198
-
PHP設計模式之调解者模式
这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充其中间汇聚点。同事对象之间应该保持松散耦合,避免一个对象直接明白指...
- dongdongsdo0310
- 2012-09-05 10:08
- 178
-
javascript 设计模式漫谈【0】 接口类的制造
近期在看 <Javascipt Design Patterns> ,虽说纯english版的看起来有点费劲伤神,但还勉强的吸取了一点知识。精神上告诉我不能太心胸狭隘。所以拿出来一点点分享吧。还有一方面也弥补我近期一直都没有写博。 我的计划是。一步步来将这个javascript设计模式汲取而且拿出来分享。那么我们的第一站。从javascript的接口讲起。 我们的服务端代码以Java语言举例,正好,这个语言与我们的javascript语言还有历史渊源。通常java语言的接口定义应该是这样滴
- 283433775
- 2010-08-26 14:13
- 1055
-
设计模式22:Mediator Pattern (调解者模式)
英文原文:http://www.dofactory.com/Patterns/PatternMediator.aspx一、Mediator Pattern (调解者模式)的定义Define an ob...- rocket5725
- 2009-07-09 13:42
- 1572
-
PHP设计模式漫谈( 转)
转自51CTO:http://developer.51cto.com/art/201004/195765.htm PHP也有设计模式?是的。我们常常看到关于Java和.NET平台上设计模式的论述和解说。事实上,在PHP 5对面向对象的支持更加完好之后,设计模式的应用也可引入到PHP中并发挥重要作用。<a title="
- yd514
- 2012-09-28 16:40
- 336
-
PHP设计模式之调解者模式
- bad7code
- 2015-06-25 10:28
- 165
-
漫谈设计模式(四)工厂(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- BUYAOZAIBEIDAOLE
- 2015-10-14 15:53
- 59
-
PHP设计模式漫谈之调解者模式
调解者模式,这个模式的目的是封装一组对象之间的相互作用。防止对象之间相互干扰。调解者(Mediator)在同事对象(Colleague)之间充其中间汇聚点。同事对象之间应该保持松散耦合,避免一个对象直...
- zhxp_870516
- 2013-01-21 14:32
- 527
-
《漫谈设计模式》一书最终出版了
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
- 2011-12-02 15:02
- 5418
-
PHP设计模式漫谈之结构模式
结构模式之间有很多类似之处,由于在对象模型结构中存在几种关系:类之间的继承和实现,加上对象组合。这些是PHP设计模式的主要目的。对象组合的最大优势在于能够在执行时基于配置建立起一...
- zhxp_870516
- 2013-01-21 15:15
- 216
0条评论