zoukankan      html  css  js  c++  java
  • 《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式

    中介者模式

    数个对象之间的通信全部委托一个中介者完成。适用于对象之间互相引用,关系错综复杂的情况。

    什么情况下需要使用中介者模式

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

    总结来看,就是当对象很多,且一个对象的状态对于最终结果和其他对象都是有意义的时候,比较适用中介者。这里的状态可以理解为属性。

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

    怎么实现中介者模式

    中介者模式可以响应对象信息,并且对具体对象做出安排。典型的观察者模式的需求,所以可以使用观察者模式来完成。

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

    具体例子

    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
  • 相关阅读:
    A1051 Pop Sequence (25 分)
    A1060 Are They Equal (25分)
    A1063 Set Similarity (25分)
    A1037 Magic Coupon (25分)
    Mybatis获取插入记录的自增长ID
    压力测试工具ab的使用
    spring注解
    《spring技术内幕》读书笔记(1)——什么是POJO模式
    用HttpSessionListener统计在线用户或做账号在线人数管理
    (转)注释驱动的 Spring cache 缓存介绍
  • 原文地址:https://www.cnblogs.com/grey-zhou/p/6375072.html
Copyright © 2011-2022 走看看