<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                >[success] # 利用中介者模式去優化剛才代碼思路 ~~~ 1.兩種解決方案: 1.1. 利用發布—訂閱模式。將 'playerDirector' 實現為'訂閱者',各 'player' 作為'發布者',一旦 player 的'狀態發生改變',便推送消息給 'playerDirector','playerDirector' 處理消息后將反饋發送給其他'player'。 1.2.在 'playerDirector' 中開放一些接收消息的接口,各 'player' 可以直接調用該接口來給'playerDirector' 發送消息,'player' 只需傳遞一個參數給 'playerDirector',這個參數的目的是使 'playerDirector' 可以識別 發送者。同樣,playerDirector 接收到消息之后會將處理結果反饋給其他 player。 ~~~ >[info] ## 書中采用第二種模式來寫 ~~~ 1.根據第二種模式來進行分析,首先'playerDirector' 就變成了一個中轉站,變成'player' 玩家實例和整個隊伍 根據玩家動作產生的隊伍結果導向的橋梁,在上了例子中,玩家死亡就會觸發隊伍信息,讓整個玩家和隊伍 變得緊湊起來,現在做法就是讓這種緊湊消除,所有關于隊伍的出來都交個了'playerDirector' 2.為了讓所有玩家可以和自己隊伍進行關聯保證互相匹配,'playerDirector' 對應也要保存所有玩家的實例對象 ~~~ >[danger] ##### 編寫第一部分玩家類 ~~~ 1.上面說到'playerDirector':在 'playerDirector' 中開放一些接收消息的接口,各 'player' 可以直接調用該接口來 給'playerDirector'發送消息,這里的'die' ,'remove ','changeTeam' 這三個方法都會去調用對應'playerDirector' 整隊伍所對應要觸發的事情 ~~~ ~~~ 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.reciveMessage( 'playerDead', this ); // 給中介者發送消息,玩家死亡 } Player.prototype.remove = function () { playerDirector.reciveMessage( 'removePlayer', this ); // 給中介者發送消息,移除一個玩家 } Player.prototype.changeTeam =function () { playerDirector.reciveMessage( 'changeTeam', this, color ); // 給中介者發送消息,玩家換隊 } ~~~ >[danger] ##### playerDirector 處理的中介者 ~~~ var playerDirector = ( function () { var players = {} ,// 保存所有玩家 operations = {} // 中介者可以執行的操作 // 新增玩家 operations.addPlayer = function (player) { var teamColor = player.teamColor // 獲取玩家顏色 players[teamColor] = players[teamColor] || [] // 存在則獲取現在該隊伍的玩家數組,不存在就新建一個 players[teamColor].push(player) // 將玩家對象放進players 對象中 } // 移除玩家 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) } } } // 玩家換隊隊伍 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 === true ){ // 全部死亡 for ( var i = 0, player; player = teamPlayers[ i++ ]; ){ player.lose(); // 本隊所有玩家 lose } for ( var color in players ){ if ( color !== teamColor ){ var teamPlayers = players[ color ]; // 其他隊伍的玩家 for ( var i = 0, player; player = teamPlayers[ i++ ]; ){ player.win(); // 其他隊伍所有玩家 win } } } } }; var reciveMessage = function(){ var message = Array.prototype.shift.call( arguments ); // arguments 的第一個參數為消息名稱 operations[ message ].apply( this, arguments ); }; return { reciveMessage: reciveMessage } } )() ~~~ >[danger] ##### 將玩家分隊的工廠函數 ~~~ // 創建隊伍的工廠 var playerFactory = function( name, teamColor ){ var newPlayer = new Player( name, teamColor ); // 創造一個新的玩家對象 playerDirector.reciveMessage( 'addPlayer', newPlayer ); // 給中介者發送消息,新增玩家 return newPlayer; }; ~~~ >[danger] ##### 使用 ~~~ // 紅隊: 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(); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看