现在的位置: 首页 > 综合 > 正文

《GOF设计模式》学习笔记—Mediator中介者

2013年03月31日 ⁄ 综合 ⁄ 共 1672字 ⁄ 字号 评论关闭
 

官方描述
用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
 
我的理解
1、Mediator中介者的引出
在面向对象的设计中,我们通常尽量把对象细化,使其只负责或呈现单一的职责,这样在某些情况下,对于一个模块,可能就需要由很多对象构成,比如在《GOF设计模式》动机中所举示例,一个图形用户界面对话框由若干个窗口组件组成,包括菜单选择框、输入框和按钮,为了便于用户使用和表现相关性,一个窗口组件的内容改变可能会影响其它窗口组件的内容,这样该窗口组件就需要具有显式的对其它窗口组件的引用,并且在变化的时候通过该引用通知其它组件。在一个极端的情况下,每个窗口组件都需要引用其它的窗口组件,且在组件内容变更时调用其它组件的相关方法。
由于这种很强的组件间关联性,会带来如下的系统问题:
1)系统结构复杂
组件间有大量的相互关联和调用,若有一个组件变化,需要跟踪和该组件关联的其它所有组件,并进行适当处理。
2)组件可重用性差
由于组件和其它组件具有很强的关联,若没有其它组件的支持,一个组件较难被另一个系统/或模块重用,这些组件表现出来更像一个不可分割的整体。
3)系统扩展性低
由于组件间的协作/关联关系被分解到各个组件中,这样若想支持新的协作或关联关系,就需要对相关的多个类型进行改善,或增加一个新的子类层次。
 
2、Mediator中介者的职责
对于组件间的这种多对多的相互关系,我们可以从各组件中进行分离,并集中封装在一个Mediator中介者对象中,由该中介者进行通讯和协调,这样多对多的复杂关系就可以通过相对简单的多对一关系实现。
在这里Mediator中介者承担两方面的职责:
1)中转作用(结构性)
通过Mediator中介者提供的中转作用,各个Colleague成员就不再需要显式的对其它成员的引用,当需要和其它成员通信时,通过中介者即可。所以该中转作用属于结构上的支持。
2)协调作用(行为性)
Mediator中介者可以更进一步的对成员间的业务关联进行封装,当成员发生变化时,成员可以一致的和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对请求成员的请求进行处理。所以该协调作用属于成员间关系行为的分离与封装。
 
3、Mediator中介者的效果
中介者模式可以达到如下效果:
1)简化了对象协议
用Mediator中介者和Colleague成员的一对多交互代替了原来成员之间的多对多交互,一对多关系更容易理解、维护和扩展。
2)它将各Colleague成员解耦
Mediator有利于各Colleague之间的松耦合,你可以独立的改变和复用各Colleague和Mediator。
3)减少子类生成
Mediator将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的Mediator子类即可,这使各个Colleague类可被重用。
 
4、Mediator中介者的适用性
在GOF《设计模式中》描述了在如下情况使用Mediator模式:
1)一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解;
2)一个对象引用其它很多对象并且直接和这些对象通讯,导致难以复用该对象;
3)想定制分布在多个类中的行为,而又不想生成太多的子类;
 
4、Mediator中介者的再扩展
我觉得对于复杂的对象之间的交互,通过引入Mediator,可以简化各成员的设计和实现,但是当情况复杂时,Mediator可能就会变得很复杂和难以维护,这时可以对Mediator进行再分解,使其只对一种类型的成员使用,这样在Mediator中就不必包括很多的if…else if 等等语句,同时当新增加一种成员时,可以通过创建该成员的Mediator类型进行支持,而对于其它成员的Mediator影响较小,从而便于维护和扩展。
对象结构图如下(看上去有些乱,呵呵)
 
5、备注
1)Mediator模式的结构图
 
 
 
2)参考资料
GOF《设计模式——可复用面向对象软件的基础》
 

 

抱歉!评论已关闭.