JavaScript——中介者模式

<!-- 中介者模式的作用就是解除对象和对象之间的紧耦合关系,中介者使各个对象之间耦合松散,而且可以独立地改变它们之间的交互 -->
		<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
					}
		}())

猜你喜欢

转载自blog.csdn.net/Miss_hhl/article/details/103703112
今日推荐