《java与模式》学习系列——调停者模式

一、调停者(Mediator)模式的结构

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

在调停者模式中,所有的成员对象都可以协调工作,但是又不直接相互管理。这些对象都与一个处于中心地位的调停者对象发生紧密关系,由这个调停者对象进行协调工作。这个协调者对象叫做调停者(Mediator),而调停者所协调的成员对象称做同事(Colleague)对象。

如所下图所示:

二、调停者模式的优点和缺点

优点

1)适当使用调停者模式可以较少使用静态的继承关系,使得具体同事类可以更加容易被复用。

2)适当使用调停者模式可以避免同事对象之间的过度耦合,使得调停类与同事类可以相对独立地演化。

3)调停者模式将多对多的相互作用转化为一对多的相互作用,使得对象之间的关系更加易于维护和理解。

4)调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

缺点

1)调停者模式降低了同事对象的复杂性,代价是增加了调停者类的复杂性。当然在很多情况下,设置一个调停者并不比不设置一个调停者更好。

2)调停者类经常充满了各个具体同事类的关系协调代码,这种代码常常是不能复用的。因此,具体同事类的复用是以调停者类的不可复用为代价的。

使用条件

调停者模式是常常被滥用的几个模式之一,在下列情况下不应当使用调停者模式。

1)不应当在责任划分混乱的时候使用

2)不应当对“数据类”和“方法类”使用

         初级设计师常常会设计出这样的一种系统:让一系列类只含有数据,另一些类只含有方法。比如,描述一个客户时,这些设计师首先设计出一个叫做客户数据的类,只含有客户数据;另外再设计一个类叫做“管理类”,含有操作客户以及此客户购买公司产品、付账的方法。管理类自然会涉及到其他的类,诸如产品数据类、订单数据类、付账数据类等。如此一来,“管理类”就变成一个操作所有的数据类的方法类,这是很没有道理的设计,但是有些设计师错误的把这叫做“调停者模式”的应用。

3)正确理解封装

封装首先是行为,以及行为所涉及的状态的封装。行为与状态是不应当分割开来的。调停者模式的用途是管理很多的对象的相互作用,以便使这些对象可以专注于自身的行为,而独立于其他的对象。

三、调停者模式与其他模式的关系

门面模式

门面模式和调停者模式很相似,两者均用来给出一个低耦合度的系统。门面模式为一个子系统提供一个简单的接口,其中消息的传送是单方向的,因为门面模式的客户端只通过门面类向子系统发出消息,而不是相反的情况。

观察者模式

调停者模式与观察者模式是功能相类似的设计模式,它们之间是相互竞争的关系。换言之,使用了其中一者往往意味着放弃另一者。观察者模式通过引入观察者对象和主题对象来达到将通信分散化的目的;而调停者模式则封装了对象之间的通信,从而将通信集中到一个个中介对象中。

阅读更多
个人分类: 设计模式系列
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭