中介者模式
中介者模式用来接触对象和对象之间的耦合关系。假如现在有一堆同父类的对象之间需要相互通信,每个对象之间都相互通信是一个不好的做法。适合的做法是采用中介者模式,每个对象都只跟中介者进行通信,就像一个星状图。
比赛
假如有10个玩家,5个人一队进行对抗;当某一玩家被击杀时,我们统计该玩家所在的队伍是否还有剩余的人;如果没有,就通知胜方和负方成员。
var Player = function (name, team) {
this.name = name;
this.team = team;
this.state = 'active';
}
Player.prototype.die = function () {
this.state = 'dead';
playerDirector.receiveMessage('playerDead', this);
}
我们让玩家本身只保存玩家状态;当玩家被击杀时,向中介者发送消息;这里可以用发布/订阅模式。
生成玩家类的时候,我们也要把队友/敌人的关系确定;这层逻辑不适合加入到玩家的构造函数当中;我们用一个工厂函数来生层这层逻辑。
var createPlayer = function (name, team) {
var player = new Player(name, team);
playerDirector.receiveMessage('createPlayer', player);
return player;
}
最后,我们来写这个中介者。
var playerDirector = (function () {
var players = {},
options = {};
options["createPlayer"] = function (player) {
var team = player.team;
players[team] ? players[team].push(player) : players[team] = [player];
}
options["playerDead"] = function (player) {
var team = player.team, teamPlayers = players[team];
var allDead = true;
for (var i = 0; i < teamPlayers.length; i++) {
var teamPlayer = teamPlayers[i];
if (teamPlayer.state === 'active') {
allDead = false;
break;
}
}
if (allDead) {
// 输出胜负结果
}
}
var receiveMessage = function (type, obj) {
options[type].apply(this, obj);
}
return {
receiveMessage: receiveMessage
}
})();