<!-- 中介者模式的作用就是解除对象和对象之间的紧耦合关系,中介者使各个对象之间耦合松散,而且可以独立地改变它们之间的交互 -->
<script>
// 未使用中介者模式=> 2 个玩家
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;
}
// --------
// playerDirector开放一个对外暴露的接口,负责接收player对象发送的消息,而player对象发送消息的时候,总是把自身的this作为参数发送给playerDirector,以便playerDirector识别来自哪个玩家对象.
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
}
}())
JavaScript——中介者模式
猜你喜欢
转载自blog.csdn.net/Miss_hhl/article/details/103703112
今日推荐
周排行