<!-- 中介者模式的作用就是解除对象和对象之间的紧耦合关系,中介者使各个对象之间耦合松散,而且可以独立地改变它们之间的交互 -->
<script>
function Player(name){
this.name=name;
this.enemy=null;
}
Player.prototype.win=function(){
console.log(this.name+'won')
};
Player.prototype.lose=function(){
console.log(this.name+'lost')
};
Player.prototype.die=function(){
this.lose();
this.enemy.win();
}
var player1=new Player('ll');
var player2=new Player('kk');
player1.enemy=player2;
player2.enemy=player1;
player1.die();
var players=[];
function Player(name,teamColor){
this.partners = [];
this.enemies = [];
this.state='live';
this.name = name;
this.teamColor=teamColor;
}
Player.prototype.win=function(){
console.log(this.name+'won')
};
Player.prototype.lose=function(){
console.log(this.name+'lost')
};
Player.prototype.die=function(){
var all_dead=true;
this.state='dead';
for(var i=0,partner;partner=this.partners[i++];){
if(partner.state!=='dead'){
all_dead=false;
break;
}
}
if(all_dead===true){
this.lose();
for(var i=0,partner;partner=this.partners[i++];){
partner.lose();
}
for(var i=0,enemy;enemy=this.enemy[i++];){
enemy.win()
}
}
}
var playerFactory=function(name,teamColor){
var newPlayer=new Player(name,teamColor);
for(var i=0,player;player=players[i++];){
if(player.teanColor===newPlayer.teamColor){
player.partners.push(newPlayer);
newPlayer.partners.push(player);
}else{
player.enemies.push(newPlayer);
newPlayer.enemies.push(player);
}
}
players.push(newPlayer);
return newPlayer;
}
function Player(name,teamColor){
this.state='alive';
this.name = name;
this.teamColor=teamColor;
}
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(){
playerDirector.ReceiveMessage('changeTeam',this)
}
var playerFactory=function(name,teamColor){
var newPlayer=new Player(name,teamColor);
playerDirector.ReceiveMessage('addPlayer',newPlayer);
}
var playerDirector=(function(){
var players={},
operations ={};
operations.addPlayer=function(player){
var teamColor=player.teamColor;
players[teamColor]=players[teamColor]||[];
players[teamColor].push(player);
}
operations.removePlayer=function(player){
var teamColor=player.teamColor;
teamPlayers=players[teamColor]||[];
for(var i=teamPlayers.length-1;i>=0;i--){
teamPlayers.splice(i,1);
}
}
operations.changeTeam=function(player,newTeamColor){
operations.removePlayer(player);
player.teamColor=newTeamColor;
operations.addPlayer(player)
}
operations.playerDead=function(player){
var teamColor=player.teamColor,
teamPlayers=players[teamColor];
var all_dead=true;
for(var i=0,player;player=teamPlayers[i++];){
if(player.state!=='dead'){
all_dead=false;
break;
}
}
if(all_dead){
for(var i=0,player;player=teamPlayers[i++]){
player.lose();
}
for(var color in players){
if(color!==teamColor){
var teamPlayers=players[color];
for(var i=0,player;player=teamColor[i++];){
player.win()
}
}
}
}
}
var ReceiveMessage=function(){
var message=Array.prototype.shift.call(arguments);
operations[message].apply(this,arguments);
}
return {
ReceiveMessage:ReceiveMessage
}
}())