欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 前端技术 > javascript >内容正文

javascript

《javascript设计模式与开发实践》读书笔记之中介者模式 -ag凯发k8国际

发布时间:2024/10/12 javascript 26 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 《javascript设计模式与开发实践》读书笔记之中介者模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

中介者模式的作用就是用来解除对象与对象之间的紧耦合关系,增加中介者后,所有相关对象都通过中介者来通信,而不再相互引用

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

总结

以上是ag凯发k8国际为你收集整理的《javascript设计模式与开发实践》读书笔记之中介者模式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图