一. 中介者模式的定义
中介者模式的定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式的作用是接触对象与对象之间的紧耦合关系。
二. 中介者模式的实现
在中介者模式中,独立的对象(colleague)之间并不直接通信,而是通过中介者对象。当其中一个colleague对象改变状态以后,它将会通知该中介者对象,而中介者对象将会把该变化传达到任意其他应该知道此变化的colleague对象。
用代码表示如下:
/* ================ 中介者对象 ================ */
var mediator = {
change: function(obj) {
switch (obj) {
case colleague1:
// colleague1 的具体交互 ... ...
break;
case colleague2:
// colleague2 的具体交互 ... ...
break;
case colleague3:
// colleague3 的具体交互 ... ...
break;
case colleague4:
// colleague4 的具体交互 ... ...
break;
}
console.log(obj.name + " has changed!");
}
};
/* ================ colleague对象 ================ */
var Colleague = function(name) {
this.name = name;
// colleague对象的功能和方法 ... ...
};
Colleague.prototype.change = function() {
mediator.change(this); // 给中介者对象发送消息
};
var colleague1 = new Colleague("colleague1"),
colleague2 = new Colleague("colleague2"),
colleague3 = new Colleague("colleague3"),
colleague4 = new Colleague("colleague4");
/* ================ 客户端调用 ================ */
colleague1.change(); // 打印"colleague1 has changed!",且完成colleague1的change事件操作
colleague2.change(); // 打印"colleague2 has changed!",且完成colleague2的change事件操作
colleague3.change(); // 打印"colleague3 has changed!",且完成colleague3的change事件操作
colleague4.change(); // 打印"colleague4 has changed!",且完成colleague4的change事件操作
三. 中介者模式的优缺点
中介者模式使得各个对象之间得以解耦,以中介者和对象之间的一对多关系取代了对象之间的网状多对多关系。各个对象只需关注自身功能的实现,对象之间的交互关系交给了中介者对象来实现和维护。
然而,中介者模式最大的缺点就是系统中新增一个中介者对象,因此对象之间交互的复杂性,转移成了中介者对象的复杂性,使得中介者对象自身往往就是一个难以维护的对象。
四. 中介者模式的适用场景
中介者模式可以很方便地对模块或对象进行解耦,一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
一般来说,如果对象之间的复杂耦合确实导致调用和维护出现困难,且耦合度随项目变化越来越高,则可以考虑使用中介者模式来重构代码。
五. 总结
中介者模式是迎合迪米特法则的一种实现。迪米特法则也叫最少知识原色,是指一个对象应该尽可能少地了解另外的对象。而在中介者模式中,对象之间几乎不存在彼此间的联系,只能通过中介者对象来互相影响。