《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
相關文章
相關標籤/搜索