javascript 中介者模式 mediator

* player.jsjavascript

/**
 * 中介者模式
 * @param {*} name  角色名稱
 * @param {*} teamColor  隊伍顏色
 */
function Player(name, teamColor) {
    this.name = name;
    this.teamColor = teamColor;
    this.state = "alive";        // 玩家生存狀態
}

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(color) {
    // 給中介者發消息 玩家換隊
    playerDirector.ReceiveMessage('changeTeam', this, color);
}

var playerFactory = function(name, teamColor) {
    // 創造一個新的玩家對象
    var newPlayer = new Player(name, teamColor);
    // 給中介者發送消息, 玩家換隊
    playerDirector.ReceiveMessage('addPlayer', newPlayer);

    return 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--) {
            if (teamPlayers[i] === player) {
                teamPlayers.splice(i, 1);
                break;
            }
        }
    }

    /************* 玩家換隊 ******************/
    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]; i++) {
            if (player.state !== 'dead') {
                all_dead = false;
                break;
            }
        }
        if (all_dead) {
            teamPlayers.forEach(function(player) {
                player.lose();
            });
            for (var color in players) {
                if (color !== teamColor) {
                    players[color].forEach(function(player) {
                        player.win();
                    });
                }
            }
        }
    }

    var ReceiveMessage = function() {
        var message = Array.prototype.shift.call(arguments);
        operations[message].apply(this, arguments);
    }

    return {
        ReceiveMessage: ReceiveMessage
    }

})();

var player1 = playerFactory('皮蛋', 'red'),
    player2 = playerFactory('小怪', 'red'),
    player3 = playerFactory('寶寶', 'red'),
    player4 = playerFactory('小強', 'red');

var player5 = playerFactory('黑妞', 'blue'),
    player6 = playerFactory('蔥頭', 'blue'),
    player7 = playerFactory('胖墩', 'blue'),
    player8 = playerFactory('海盜', 'blue');


// player1.die(); player2.die(); player3.die(); player4.die();
// player1.remove();  player2.remove(); player3.die(); player4.die();
player1.changeTeam('blue');  player2.die(); player3.die(); player4.die();

  Run:java

VM394:17 小怪 lost
VM394:17 寶寶 lost
VM394:17 小強 lost
VM394:13 黑妞 won
VM394:13 蔥頭 won
VM394:13 胖墩 won
VM394:13 海盜 won
VM394:13 皮蛋 won

  

* 購物車bash

相關文章
相關標籤/搜索