1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| class Player { state = 'alive' constructor(name, teamColor) { this.name = name; this.teamColor = teamColor; } win() { console.log(this.name + ' won '); } lose() { console.log(this.name + ' lose '); } die() { this.state = 'dead' PlayerDirector.reciveMessage('playerDead', this); } remove() { PlayerDirector.reciveMessage('removePlayer', this); } changeTeam(color) { PlayerDirector.reciveMessage('changeTeam', this, color); } } function playerFactory(name, teamColor) { let newPlayer = new Player(name, teamColor); PlayerDirector.reciveMessage('addPlayer', newPlayer); return newPlayer; };
class PlayerDirector { static players = {}; static addPlayer(player) { const teamColor = player.teamColor; this.players[teamColor] = this.players[teamColor] || []; this.players[teamColor].push(player); }; static removePlayer(player) { let teamColor = player.teamColor, teamPlayers = this.players[teamColor] || []; for (let i = teamPlayers.length - 1; i >= 0; i--) { if (teamPlayers[i] === player) { teamPlayers.splice(i, 1); } } }; static changeTeam(player, newTeamColor) { this.removePlayer(player); player.teamColor = newTeamColor; this.addPlayer(player); }; static playerDead(player) { let teamColor = player.teamColor, teamPlayers = this.players[teamColor]; let all_dead = true; for (let i = 0, player; player = teamPlayers[i++];) { if (player.state !== 'dead') { all_dead = false; break; } } if (all_dead === true) { for (let i = 0, player; player = teamPlayers[i++];) { player.lose(); } for (let color in this.players) { if (color !== teamColor) { let teamPlayers = this.players[color]; for (let i = 0, player; player = teamPlayers[i++];) { player.win(); } } } } }; static reciveMessage() { let message = Array.prototype.shift.call(arguments); this[message].apply(this, arguments); }; }
const player1 = playerFactory('A', 'red'), player2 = playerFactory('B', 'red'), player3 = playerFactory('C', 'red'), player4 = playerFactory('D', 'red');
const player5 = playerFactory('E', 'blue'), player6 = playerFactory('F', 'blue'), player7 = playerFactory('G', 'blue'), player8 = playerFactory('I', 'blue');
player1.die(); player2.die(); player4.die(); player3.die();
|