《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式

中介者模式

数个对象之间的通讯所有委托一个中介者完成。适用于对象之间互相引用,关系错综复杂的状况。数组

 

什么状况下须要使用中介者模式

对象较多,且对象间会相互引用,当一个对象的某个状态改变时,得通知其余对象。形象点的例子,好比说团队游戏,每一个对象之间都有关系,不是队友就是敌人,当一个对象死亡就得通知其余对象,当一队所有死亡,就得宣布另外一队胜利。假设不用中介者模式,那任何一个对象死亡时,必须通知全部对象,并且得遍历一遍队友是否都已经死亡。又好比火车的线路调度,若是不经过中介者,你让火车之间彼此相互确认位置,而后分配速度,确保线路畅通,显然也是不现实的。框架

总结来看,就是当对象不少,且一个对象的状态对于最终结果和其余对象都是有意义的时候,比较适用中介者。这里的状态能够理解为属性。this

或者说的形象一点,当须要总体调度的时候,就应该使用中介者模式。不管是调度火车线路仍是管理游戏玩家,都须要一个信息的管理者。spa

 

怎么实现中介者模式

中介者模式能够响应对象信息,而且对具体对象作出安排。典型的观察者模式的需求,因此可使用观察者模式来完成。prototype

或者也可让中介者提供具体的接口,对象经过接口和中介者交互。code

 

具体例子

MVC框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。对象

 

优缺点

优势:一、下降了类的复杂度,将一对多转化成了一对一。 二、各个类之间的解耦。
缺点:中介者会庞大,变得复杂难以维护。blog

 

代码例子

玩家组队进行游戏,互相标记为队友或者是敌人,死亡一个敌人,提示死亡,当一队所有阵亡,宣布另一队获胜。接口

 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
相关文章
相关标签/搜索