日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

《JavaScript设计模式与开发实践》读书笔记之中介者模式

發布時間:2024/10/12 javascript 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《JavaScript设计模式与开发实践》读书笔记之中介者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?中介者模式

中介者模式的作用就是用來解除對象與對象之間的緊耦合關系,增加中介者后,所有相關對象都通過中介者來通信,而不再相互引用

1.1中介者模式的例子

以泡泡堂游戲為例,先定義一個玩家構造函數,它有三個原型方法

Player.prototype.win,Player.prototype.lose,Player.prototype.die

?

當只有兩個玩家時,一個玩家死亡時游戲結束,同時通知他的對手勝利

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+'lose'); }; Player.prototype.die=function(){console.log(this.name+'die'); };

接下來創建兩個玩家

var player1=new Player('玩家1'); var player2=new Player('玩家2'); //設置敵人 player1.enemy=player2; player2.enemy=player1; //玩家1死亡時,調用自己的die方法完成一局游戲 player1.die();

?

當玩家增加時,每個玩家有了自己的隊友和若干敵人

定義一個數組players保存所有的玩家,創建玩家之后,循環players來給每個玩家設置敵人和隊友

var players=[];

再改寫構造函數Player,使每個玩家對象都增加一些屬性,分別是隊友列表、敵人列表、玩家當前狀態、角色名字以及玩家所在隊伍的顏色

function Player(name,teamColor){this.partners=[];this.enemies=[];this.state='live';this.name=name;this.teamColor=teamColor; }

勝利和失敗后,對每個玩家提示結果

Player.prototype.win=function(){console.log('winner:'+this.name); }; Player.prototype.lose=function(){console.log('loser:'+this.name); };

玩家死亡時,需要遍歷其他隊友的狀況,如果隊友全部死亡,這局游戲失敗,同時敵人所有玩家勝利

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.enemies[i++];){enemy.win();}} };

最后定義一個工廠來創建玩家

var playerFactory=function(name,teamColor){var newPlayer=new Player(name,teamColor);//創建新玩家for(var i=0,player;player=players[i++];){//通知所有玩家,新玩家加入if(player.teamColor === newPlayer.teamColor){//隊友加入 player.partners.push(newPlayer);newPlayer.partners.push(player);}else{player.enemies.push(newPlayer);newPlayer.enemies.push(player);}}players.push(newPlayer);return newPlayer; };

用這段代碼來創建8個玩家,分屬紅藍兩隊

var player1=playerFactory('p1','red'); var player2=playerFactory('p2','red'); var player3=playerFactory('p3','red'); var player4=playerFactory('p4','red');var player5=playerFactory('p5','blue'); var player6=playerFactory('p6','blue'); var player7=playerFactory('p7','blue'); var player8=playerFactory('p8','blue');

讓紅隊全部死亡

player1.die(); player2.die(); player3.die(); player4.die();

此時藍隊玩家勝利

1.2 用中介者模式改造上述示例

上述示例中,每個玩家和其他玩家都是緊耦合在一起,partners,enemies保存著其他玩家對象的引用。當對象狀態改變,如死亡時,必須顯示遍歷通知其他玩家

?首先仍然是定義Player構造函數和player對象的原型方法

function Player(name,teamColor){this.name=name;this.teamColor=teamColor;this.state=state; };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; };

playerDirector開放一個對外暴露的接口ReceiveMessage,負責接收player對象發送的消息,
而player對象發送的時候,總是把自身this作為參數發送給playDirector,以便playerDirector識別消息來自于哪個玩家對象

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);}}};//玩家換隊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();}for(var color in players){if(color !== teamColor){var teamPlayers=players[color];//對手玩家for(var i=0,player;player=teamPlayers[i++];){player.win();}}}}}var ReceiveMessage=function(){var message=Array.prototype.shift.call(arguments);operations[message].apply(this,arguments);};return{ReceiveMessage:ReceiveMessage} })();

現在除了中介者本身,沒有一個玩家知道其他玩家的存在,玩家與玩家之間的耦合關系已經解除

某個玩家的任何操作不需要通知其他買家,只需要給中介者發送一個消息

中介者處理完消息之后,把處理結果反饋給其他玩家

轉載于:https://www.cnblogs.com/GongQi/p/4681630.html

總結

以上是生活随笔為你收集整理的《JavaScript设计模式与开发实践》读书笔记之中介者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。