您的位置:首页 > 其它

设计模式之Mediator(中介者)模式(理论篇)

2012-04-11 22:21 796 查看
本文编辑整理自:
http://tech.it168.com/a2009/0407/270/000000270955_1.shtml
http://www.java63.com/design_pattern/mediator_pattern.html
http://blog.csdn.net/haiyan0106/article/details/1651719

一、基本知识

   Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用

    Mediator模式封装了一系列对象相互作用的方式,使得这些对象不必互相明显参照;从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其它的一些对象之间的相互作用;从而可以保证这些相互作用可以彼此独立地变化.

   在下面的示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象。这些同事对象通过彼此的相互作用形成系统的行为,如图1所示。从图1中可以看出,几乎每一个对象都需要与其它的对象发生相互作用,而这种相互作用表现为一个对象与另一个对象的直接耦合。
图1:

这是一个过度耦合的系统



  通过引入中介者对象(Mediator),可以将系统的网状结构变成以中介者为中心的星形结构,如图2所示。在这个星形结构中,同事对象不再通过直接的联系与另一个对象发生相互作用;相反地,它通过调停者对象与另一个对象发生相互作用。调停者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入造成大量的修改工作。
图2:

这是一个使用了Mediator架构模式之后的结构图

 



    和传统的设计方法相比,面向对象的技术可以更好地协助设计师管理更为复杂的系统。一个好的面向对象的设计可以使对象之间增加协作性(Collaboration),减少耦合度(Coupling)。一个深思熟虑的设计会把一个系统分解为一群相互协作的同事对象,然后给每一个同事对象以独特的责任,恰当的配置它们之间的协作关系,使它们可以在一起工作。在Mediator模式中,所有的成员对象都可以协调工作,但是又不直接相互管理。这些对象都与一个处于中心地位的调停者对象发生紧密的关系,由这个调停者对象进行协调工作。这个协调者对象叫做中介者(Mediator),而调停者所协调的成员对象称做同事(Colleague)对象。

    在Colleague对象内部发生的事件会影响到所有的同事,但是这种影响不是以直接管理的方式直接传到其它的对象上的。记住在小组的成员增加时,这样的相互作用关系是以比指数更快的方式增加的。相反,这种影响仅仅直接影响到调停者对象,而调停者对象反过来会协调其它的同事,形成整个系统的行为。

    如果小组的成员增加时,调停者对象可能会面临修改,而其它的同事则可以装做不知道这个新的成员一样,不必修改。反过来,如果小组的成员之一被从系统中删除的话,调停者对象需要对此做出修改,而小组中其它的同事则不必改动。 
二、中介者模式的结构
   Mediator模式的经典结构如下图:
图3



 mediator

    中介者类的抽象父类。
concreteMediator

    具体的中介者类。
colleague

关联类的抽象父类。
concreteColleague

    具体的关联类。
三、中介者模式的优点和缺点
Mediator模式的优点如下

1、减少了子类生成Mediator将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成Mediator的子类即可,这样各个Colleague类可被重用。

2、它将各Colleague解耦。Mediator有利于各Colleague间的松耦合,你可以独立的改变和复用各Colleague类和Mediator类。

3、它简化了对象协议用Mediator和各Colleague间的一对多的交互来代替多对多的交互。一对多的关系更易于理解、维护和扩展。

4、它对对象如何协作进行了抽象将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的。
Mediator模式的缺点如下:

1、它使控制集中化中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任一个Colleague都复杂。这可能使得中介者自身成为一个难于维护的庞然大物。
四、和其它设计模式的比较
4.1、Mediator与Proxy的比较
   Proxy模式是简化的Mediator模式?个人认为从功能上讲,Mediator模式与Proxy模式存在一定的相似性,但Proxy主要在于控制对被访问对象的访问,这种访问往往是单向的,而Mediator模式则在于为系统内不同的对象之间的访问提供一种媒介,这种访问往往是多向的。
4.2、Mediator与Facade的比较

   很多设计模式的书中都会将Mediator模式与Facade模式进行比较,个人认为二者的区别十分明显:Facade模式是为整个子系统对外提供一个简单化的接口,子系统的内部可能十分复杂,很多类交互作用才形成了最终的简单化的统一接口;而Mediator模式则作为系统内多个对象交互的“媒介”,负责封装对象间的交互,所有对象只需要与Mediator类交互,而不是相互之间直线联系。所以,也许在实现Facade模式时在子系统的内部采用Mediator模式可能是个不错的选择。

关于Mediator(中介者)模式的实际使用请阅读《设计模式之Mediator(中介者)模式(应用篇)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 工作 扩展