《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式
2017-02-08 15:43
363 查看
中介者模式
数个对象之间的通信全部委托一个中介者完成。适用于对象之间互相引用,关系错综复杂的情况。什么情况下需要使用中介者模式
对象较多,且对象间会相互引用,当一个对象的某个状态改变时,得通知其他对象。形象点的例子,比如说团队游戏,每个对象之间都有关系,不是队友就是敌人,当一个对象死亡就得通知其他对象,当一队全部死亡,就得宣布另一队胜利。假设不用中介者模式,那任何一个对象死亡时,必须通知所有对象,而且得遍历一遍队友是否都已经死亡。又比如火车的线路调度,如果不通过中介者,你让火车之间彼此相互确认位置,然后分配速度,确保线路畅通,显然也是不现实的。总结来看,就是当对象很多,且一个对象的状态对于最终结果和其他对象都是有意义的时候,比较适用中介者。这里的状态可以理解为属性。
或者说的形象一点,当需要整体调度的时候,就应该使用中介者模式。无论是调度火车线路还是管理游戏玩家,都需要一个信息的管理者。
怎么实现中介者模式
中介者模式可以响应对象信息,并且对具体对象做出安排。典型的观察者模式的需求,所以可以使用观察者模式来完成。或者也可以让中介者提供具体的接口,对象通过接口和中介者交互。
具体例子
MVC框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。优缺点
优点:1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。缺点:中介者会庞大,变得复杂难以维护。
代码例子
玩家组队进行游戏,互相标记为队友或者是敌人,死亡一个敌人,提示死亡,当一队全部阵亡,宣布另外一队获胜。1 var player=function(name,teamcolor){ //玩家类 2 this.name=name; 3 this.teamcolor=teamcolor; 4 } 5 6 player.prototype.win=function(){ 7 console.log( this.teamcolor+"队 "+this.name+" win" ); 8 } 9 10 player.prototype.die=function(){ 11 control.playerdie(this); //control为中介对象 12 } 13 14 15 var createPlayer=function(name,teamcolor){ //玩家工厂,新建一个工厂需要做两件事情,一个是创造这个对象,第二个是通知中介者 16 var newPlayer=new player(name,teamcolor); 17 control.addplayer(newPlayer); 18 19 return newPlayer; 20 } 21 22 var control=(function(){ 23 var players={}; // 储存玩家 24 var handler={}; //添加具体方法的对象 25 26 handler.addplayer=function( player ){ 27 var teamcolor=player.teamcolor; 28 players[teamcolor]=players[teamcolor] || []; //如果存在相应队伍数组就返回,否则创建一个新的数组 29 30 players[teamcolor].push( player ); 31 } 32 33 handler.playerdie=function( player ){ 34 var death_all=true; //判断器 35 player.state="death"; 36 console.log( player.teamcolor+"队 "+player.name+"死亡" ); 37 var teamcolor=player.teamcolor; 38 for(var i=0,per;per=players[teamcolor][i++];){ 39 if( per.state!="death" ){ 40 death_all=false; 41 break; 42 } 43 } 44 45 if ( death_all ){ 46 for (var color in players){ 47 if( color!=teamcolor){ 48 for(var i=0,people;people=players[color][i++]; ){ 49 people.win(); 50 } 51 } 52 } 53 } 54 55 } 56 57 return handler; 58 })(); 59 60 var aaa=new createPlayer("王蛋蛋","红"); 61 var bbb=new createPlayer("李蛋蛋","红"); 62 var ccc=new createPlayer("赵蛋蛋","红"); 63 64 var en1=new createPlayer("李小花","蓝"); 65 var en2=new createPlayer("王小草","蓝"); 66 var en3=new createPlayer("李大白","蓝"); 67 68 en1.die(); 69 bbb.die(); 70 aaa.die(); 71 en2.die(); 72 ccc.die(); 73 74 /*执行结果*/ 75 // 蓝队 李小花死亡 76 // 红队 李蛋蛋死亡 77 // 红队 王蛋蛋死亡 78 // 蓝队 王小草死亡 79 // 红队 赵蛋蛋死亡 80 // 蓝队 李小花 win 81 // 蓝队 王小草 win 82 // 蓝队 李大白 win
相关文章推荐
- 《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式
- 《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式
- 设计模式 --> (14)中介者模式
- 14.中介者模式
- JAVA设计模式(14):行为型-中介者模式(Mediator)
- 设计模式--14、中介者模式
- Java设计模式14——中介者(Mediator)模式
- 【学习笔记javascript设计模式与开发实践(中介者模式)----14】
- Java设计模式14——中介者(Mediator)模式
- 14.中介者模式(设计模式笔记)
- JAVA设计模式(14):行为型-中介者模式(Mediator)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 设计模式----Mediator(中介者)模式
- 设计模式(14)-Flyweight Pattern
- 工作流模式详解之流程控制模式(12、13、14、15)——Multiple Instances
- 中介者(Mediator)模式
- .NET设计模式(14):代理模式(Proxy Pattern)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 设计模式之Mediator中介者模式
- 浅议Java设计模式的中介者模式