中介者模式
在程序里,也许一个对象会和其他10个对象打交道,所以它会保持10个对象的引用。当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用。当我们改变或删除其中一个对象的时候,很可能需要通知所有引用到它的对象,这样就增加了修改的难度,不利于程序的扩展。
中介者模式的作用就是解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所有的相关对象都通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知中介者对象即可。中介者使各对象之间耦合松散,而且可以独立地改变它们之间的交互。中介者模式使网状的多对多关系变成了相对简单的一对多关系
理解中介者模式,需要从现实中入手毕竟现实中的一些事物更加具象。
以机场指挥塔为例,每架飞机都只需要和指挥塔通信。指挥塔作为调停者,知道每一架飞机的飞行状况,所以它可以安排所有飞机的起降时间,及时做出航线调整。
中介者模式实现
let Media = (function (){
const message = {};
return {
// regist用于订阅消息,当某个对象发生变化时,订阅了相同的事件的对象可以接收到其他对象的变化
regist(type,fn){
if(!message[type]){
message[type] = []
}
message[type].push(fn);
},
// 当某个对象触发事件,通过中介者向其他订阅了事件的对象发送消息
send(type){
let fns = message[type];
for(let i = 0; i < fns.length;i++){
fns[i]();
}
}
}
})();
中介者模式使用场景
中介者模式使用于对象之间的复杂耦合确实导致调用和维护出现了困难,而且这些耦合度随项目的变化呈指数增长曲线,那我们就可以考虑用中介者模式来重构代码。
总结
中介者模式是迎合迪米特法则的一种实现。迪米特法则也叫最少知识原则,是指一个对象应该尽可能少地了解另外的对象(类似不和陌生人说话)。如果对象之间的耦合性太高,一个对象发生改变之后,难免会影响到其他的对象。因此,中介者模式使各个对象之间得以解耦,以中介者和对象之间的一对多关系取代了对象之间的网状多对多关系。各个对象只需关注自身功能的实现,对象之间的交互关系交给了中介者对象来实现和维