概念
- 中介者模式的作用就是解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所有的相关对象都通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知中介者对象即可。中介者使各对象之间耦合松散,而且可以独立地改变它们之间的交互。中介者模式使网状的多对多关系变成了相对简单的一对多关系。
例子
const playerDirector = (function () {
const players = {}
const operations = {}
operations.addPlayer = function (player) {
const teamColor = player.teamColor
players[teamColor] = players[teamColor] || []
players[teamColor].push(player)
}
operations.removePlayer = function (player) {
const teamColor = player.teamColor,
teamPlayers = players[teamColor] || []
for (let i = teamPlayers.length - 1; i >= 0; i--) {
if (teamPlayers[i] === player) {
teamPlayers.splice(i, 1)
}
}
}
operations.changeTeam = function (player, newTeamColor) {
operations.removePlayer(player)
player.teamColor = newTeamColor
operations.addPlayer(player)
}
operations.playerDead = function (player) {
const teamColor = player.teamColor
const teamPlayers = players[teamColor]
let all_dead = true
for (let i = 0; i < teamPlayers.length; i ++) {
if (teamPlayers[i].state !== 'dead') {
all_dead = false
break
}
}
if (all_dead === true) {
for (let i = 0; i < teamPlayers.length; i ++) {
teamPlayers[i].lose()
}
for (let color in players) {
if (color !== teamColor) {
const orderTeamPlayers = players[color]
for (let i = 0; i < orderTeamPlayers.length; i ++) {
orderTeamPlayers[i].win()
}
}
}
}
}
const ReceiveMessage = function (funName, ...args) {
operations[funName].apply(this, args)
}
return {
ReceiveMessage: ReceiveMessage
}
})()
function Player (name, teamColor) {
this.name = name
this.teamColor = teamColor
this.state = 'alive'
}
Player.prototype.win = function () {
console.log(this.name + ' won ')
}
Player.prototype.lose = function () {
console.log(this.name + ' lost')
}
Player.prototype.die = function () {
this.state = 'dead'
playerDirector.ReceiveMessage('playerDead', this)
}
Player.prototype.remove = function () {
playerDirector.ReceiveMessage('removePlayer', this)
}
Player.prototype.changeTeam = function (color) {
playerDirector.ReceiveMessage('changeTeam', this, color)
}
const playerFactory = function (name, teamColor) {
const newPlayer = new Player(name, teamColor)
playerDirector.ReceiveMessage('addPlayer', newPlayer)
return newPlayer
}
export default playerFactory
总结
- 中介者模式是迎合迪米特法则的一种实现。迪米特法则也叫最少知识原则,是指一个对象应该尽可能少地了解另外的对象(类似不和陌生人说话)。如果对象之间的耦合性太高,一个对象发生改变之后,难免会影响到其他的对象,跟“城门失火,殃及池鱼”的道理是一样的。而在中介者模式里,对象之间几乎不知道彼此的存在,它们只能通过中介者对象来互相影响对方。
- 好处:中介者模式使各个对象之间得以解耦,以中介者和对象之间的一对多关系取代了对象 之间的网状多对多关系。各个对象只需关注自身功能的实现,对象之间的交互关系交给了中介者对象来实现和维护。
- 缺点:中介者模式也存在一些缺点。其中,最大的缺点是系统中会新增一个中介者对象,因 为对象之间交互的复杂性,转移成了中介者对象的复杂性,使得中介者对象经常是巨大的。中介者对象自身往往就是一个难以维护的对象。
github仓库地址:点击 设计模式例子 查看