在我们生活的世界中,每个人每个物体都会产生一些错综复杂的联系,在应用程序里也是一样,所有对象都按照某种关系和规则来通信
在程序里,也许一个对象会和其他10个对象打交道,当程序的规模增大,对象会越来越多,关系会越来越复杂。当我们想改变或者删除的时候,必须小心翼翼,很容易出问题
解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所有的对象都通过中介者对象来通信,而不是相互引用,所以当一个对象发生改变时,只需要通知中介者对象即可。
中介者对象使网状的多对多关系变成了相对简单的一对多关系
看上图,如果对象A发生了改变,则需要同时通知其他所有对象
- 机场指挥塔
中介者也被称为调停者,我们想象一下机场的指挥塔,如果没有指挥塔的存在,每一架飞机要和方圆100公里内的所有飞机通信,才能确认航线以及飞行情况,后果是不可想象的。
现实中的情况是,每架飞机都只需要和指挥塔通信。从而知道飞行情况
- 菠菜公司
在世界杯期间购买足球彩票,如果没有菠菜公司作为中介,上千位的人一起计算赔率和输赢绝对是不可能实现的事情。有了菠菜公司作为中介,每个人只需要和菠菜公司发生关系,菠菜公司会根据所有人的投注情况计算和赔率,彩民们赢钱就从菠菜公司拿,输了钱就交给菠菜公司
假如玩家的数目为2,所以当其中一个玩家死亡的时候游戏结束,同时通知队友胜利。
function Player(name) {
this.name = name
this.enemy = null // 敌人
}
Player.prototype.win = function() {
console.log(`${this.name}win`)
}
Player.prototype.lose = function() {
console.log(`${this.name}lose`)
}
Player.prototype.die = function() {
this.lose()
this.enemy.win()
}
接下来创建2个游戏对象:
const player1 = new Player('皮蛋')
const player2 = new Player('鸭子')
给玩家相互设置敌人
player1.enemy = player2
player2.enemy = player1
当玩家1被泡泡炸死的时候,只需要调用这一句代码即可
player1.die() // 输出:皮蛋lose、鸭子win
现在我们改进一下游戏。把玩家数量变为8个,用下面的方式设置队友和敌人无疑很低效
player1.partners = [player1, player2, player3, player4]
player1.enemies = [player5, player6, player7, player8]
player5.partners = [player5, player6, player7, player8]
player5.enemies = [player1, player2, player3, player4]
接下来,让我们看看正常的代码
现在我们已经可以随意增加玩家或者队伍,但问题是,每个玩家和其他玩家都是紧密耦合的。
在这个例子中只创建了8个玩家,而如果在一个大型网游里,画面里有成百上千个玩家,几十支队伍互相厮杀,如果有一个玩家掉线,必须从所有其他玩家的队友列表中都移除这个玩家。游戏也许还有解除队伍和添加到别的队伍的功能,红色玩家可以突然变成蓝色玩家,这就不仅仅是循环能够解决的问题了。面对这样的需求,我们上面的代码可就差强人意了。
最大的缺点是系统中会新增一个中介者对象,因为对象之间交互的复杂性,转移成了中介者对象的复杂性,使得中介者对象经常是巨大的。中介者对象自身往往是一个难以维护的对象