中介者模式
中介者模式
定义
在生活的世界中,每个人每个物体之间都会产生一些错综复杂的联系,在应用程序中也一样,程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信
现实中一个人大概只能记住 10 个朋友的电话,30家餐厅的位置,在程序里,也许一个对象会和其他 10 个对象交互,所以它会保持 10 个对象的引用,当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用,当改变或删除其中一个对象的时候,很可能需要通知所有引用它的对象,这样一来,就像在心脏旁边拔掉一根毛细血管,即使一点很小的修改也必须小心翼翼
面相对象设计鼓励将行为分布到各个对象中,把对象划分成更小的粒度,有助于增强对象的可复用性,但由于这些细粒度对象之间的联系激增,又有可能会反过来降低它们的可复用性
中介者模式的作用就是解除对象之间的紧耦合关系,增加一个中介者对象后,所有的相关对象都通过中介者对象来通信,而不是相互引用,所以当一个对象发生改变时,只需要通知中介者对象即可,中介者使各对象之间耦合松散,而且可以独立地改变它们之间的交互,中介者模式使网状的多对多关系变成了相对简单的一对多关系
如果某个对象发生了改变,则需要同时通知所有与该对象发生引用关系的对象,使用中介者模式后只需要通知中介者对象即可
小结
中介者模式是迎合迪米特法则的一种实现,迪米特法则也叫最少知识原则,是指一个对象应该尽可能少地了解另外的对象(类似不和陌生人说话),如果对象之间的耦合性太高,一个对象发生改变之后,难免会影响到其他的对象,跟“城门失火,殃及池鱼”的道理是一样的,而在中介者模式里,对象之间几乎不知道彼此的存在,它们只能通过中介者对象来互相影响对方
因此,中介者模式使各个对象之间得以解耦,以中介者和对象之间的一对多关系取代了对象之间的网状多对多关系,各个对象只需关注自身功能的实现,对象之间的交互关系交给了中介者对象来实现和维护
不过,中介者模式也存在一些缺点,最大的缺点就是系统中会新增一个中介者对象,因为对象之间交互的复杂性,转移成了中介者对象的复杂性,使得中介者对象经常是巨大的,中介者对象自身往往就是一个难以维护的对象
都知道,毒贩子虽然使吸毒者和制毒者之间的耦合度降低,但毒贩子也要抽走一部分利润,同样,在程序中,中介者对象要占走一部分内存,而且毒贩本身还要防止被警察抓住,因为它了解整个犯罪链条中的所有关系,这表明中介者对象自身往往是一个难以维护的对象
中介者模式可以非常方便的对模块或者对象进行解耦,但对象之间并非一定需要解耦,在实际项目中,模块或对象之间有一些依赖关系是很正常的,比较写程序时为了快速完成项目交付成产,而不是堆砌模式和过度设计,关键就在于如何衡量对象之间的耦合程度,一般来说,如果对象之间的复杂耦合确实导致调用和维护出现了困难,而且这些耦合度会随项目的变化程指数增长曲线,那就可以考虑用中介者模式来重构代码