大话设计模式二十三之中介者模式

中介者模式又叫做调停者模式。其实就是中间人或者调停者的意思。


最近伊拉克又接连发射管了多起爆炸事件,战争带给人类的真是无法弥补的伤痛。世界需要和平。如果不是伊拉克战争,可能就没这么多事情了。再比如巴以问题、伊朗核问题、朝鲜核问题以及各国间的政治外交问题,构成了极为复杂的国际形式。

由于各国之间代表的利益不同,所以矛盾冲突是难免的,但如果又这样一个组织,由各国的代表组成,用来维护国际和平与安全,解决国际间经济、社会、文化和人道主义性质的问题,比如联合国组织,它就是一个调停者、中介者的角色。

各国之间关系复杂,战略盟友、战略伙伴、战略对手、利益相关者等等,各国都需要投入大量的人力物力在政治、经济、外交方面来搞好这些关系,但不管如何努力,国与国之间的关系还是会随着时间和社会发展而发生改变。在第二次世界大战以前,由于没有这样一个民主中立的协调组织,使得就出现了法西斯联盟,给人类史上造成最大的灾难--二战。而自1945年成立联合国后,地球上再没有发生世界范围的战争,可以说联合国对世界和平的贡献不可估量。


国与国之间的关系,就类似于不同的对象与对象之间的关系,者就要求对象之间需要知道其他所有对象。

尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性了。

因为大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。


要解决这样的问题,可以应用“迪米特法则”,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。在这里,国与国之间完全可以通过‘联合国’这个中介者为中心的星形结构,每个具体对象不再通过直接的联系与俩一个对象发生相互作用,而是通过‘中介者’对象与另一个对象发生相互作用。中介者对象的设计,使得系统的结构不会因为新对象的引入造成大量的修改工作。



2、中介者模式

中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互调用,从而式其耦合松散,而且可以独立地改变它们之间的交互。


Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同时对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事发出命令。





由于由了Mediator,使得ConcreteCollegue1和ConcreteColleague2在发送消息和接收消息时其实是通过中介者来完成的,这就减少了它们之间的耦合度了。

需求:美国和伊拉克之间的对话都是通过联合国安理会作为中介来完成。

美国和伊拉克都是国家,由一个国家抽象类和两个具体国间类就可以了。但‘联合国’到底是Mediator还是ConcreteMediator呢?

这要取决于未来是否有可能扩展中介者对象,比如联合国除了安理会,还有没有可能有其他机构存在呢?

联合国的机构还有如国间劳工组织、教科文组织、世界卫生组织、世界贸易组织等等,所以jMediator应该是‘联合国机构’,而‘安理会’是一个具体的中介者。

如果不存在扩展情况,那么Mediator可以与ConcreteMediator合二为一。


3、安理会做中介






尽管这样的设计可以减少ConcreteColleague类之间的耦合,但这又使得ConcreteMediator责任太多了,如果它出了问题,则整个系统都会有问题了。

4、中介者模式优缺点

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了‘多对多’复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。


中介者模式的优点首先是Mediator的出现减少了各个Colleagued 耦合,使得可以独立地改变和复用各个Colleague类和Mediator,

比如各个国家的改变不会影响到其他国间,而至少与安理会发生变化。

其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

比如巴以冲突,本来只能算是国与国之间的矛盾,因此各自的看法可能都比较狭隘,但站在联合国安理会的角度,就可以从全球化、也更客观的角度来看待这个问题,在调停和维和上做出贡献。



中介者模式的缺点:

具体中介者类ConcreteMediator可能会因为ConcreteColleague的越来越多而变得非常复杂,反而不容易维护了。

由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。

事实上,联合国安理会秘书长的工作应该是非常繁忙的,谁叫他就是‘全球最大的官’呢。也正因为如此,中介者模式的优点来自集中控制,其缺点也是它。


平时用.NET写的Windows应用程序中的Form或Web网站程序的aspx就是典型的中介者。比如计算器程序,它上面有菜单控件、

文本控件、多个按钮控件和一个Form窗体,每个控件之间的通信都是通过谁来完成的?它们之间是否知道对方的存在?


每个控件的代码都被封装了,所以它们的实例是不会知道其他控件对象的存在的。比如点击数字按钮要在文本框中显示数字,按照以前的想法就应该要在Button类中编写给TextBox类实例的Text属性赋值的代码,造成两个类有耦合,这显然是非常不合理的。但实际情况是它们都有事件机制,而事件的执行都是在Form窗体的代码中完成,也就是说所有的控件的交互都是由Form窗体来作中介,操作各个对象,这是典型的中介者模式应用。


中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。



猜你喜欢

转载自blog.csdn.net/nicolelili1/article/details/80193764
今日推荐