12.设计模式(中介者模式)

2020-11-20  本文已影响0人  悠哈121
1.中介者模式解除对象与对象之间的紧耦合关系,增加一个中介者对象后,所有的相关对象都可以通过中介者对象来通信,而不是相互引用,所以当一个对象发生改变时,只需要通知中介者对象即可 image.png image.png

机场指挥塔,如果没有指挥塔的存在,每一架飞机要和方圆100公里的所有飞机通信,才能确定航线以及飞行状况,后果是很难想象的

代码实现1.多个游戏团队,当其他团队人员都死亡后,剩下的一个团队则获取胜利
function Player(name,teamColor){
  this.name = name;
  this.teamColor = teamColor;
}
// 玩家死亡
Player.prototype.die = function(){
  playerDirector.reciveMessage('playerDead',this)  //给中介者发送消息,玩家死亡
}
var playerFactory = function(name,teamColor){
  var newPlayer = new Player(name,teamColor);
  playerDirector.reciveMessage('addPlayer',newPlayer)
  return newPlayer;
}
var playerDirector = (function(){
  var players = {},operations = {}; //保存所有玩家,中介者可以执行的操作
  // 新增一个玩家
  operations.addPlayer = function(player){
    var teamColor = player.teamColor;
    players[teamColor] = players[teamColor]?players[teamColor]:[];
    players[teamColor].push(player);
  }
  operations.removePlayer = function(player){
    let teamPlayers = players[player.teamColor];
    for(let i = 0; i < teamPlayers.length;i++){
      if(teamPlayers[i] === player){
        teamPlayers.splice(i,1)
      }
    }
  },
  operations.playerDead = function(player){
    let teamPlayers = players[player.teamColor];
    console.log(player.name + " 死亡..");
    operations.removePlayer(player)
    if(teamPlayers.length === 0){
      delete players[player.teamColor]
      console.log(player.teamColor + "队伍死亡..");
      let key = Object.keys(players);
      if(key.length === 1){
        console.log(players[key[0]][0].teamColor +"胜利,游戏结束")
      }
    }
  }
  return{
    reciveMessage:function(){
      var message = Array.prototype.shift.call(arguments);
      operations[message].apply(this,arguments)
    }
  }
})()
//红队
var player1 = playerFactory( '皮蛋', 'red' ),player2 = playerFactory( '小乖', 'red' );
//蓝队
var player3 = playerFactory( '黑妞', 'blue' ), player4 = playerFactory( '葱头', 'blue' );
//绿队
var player5 = playerFactory( '太阳', 'green' ), player6 = playerFactory( '月亮', 'green' );
player1.die(); 
player2.die(); 
player5.die(); 
player6.die();
//可以看到,除了中介者本身,没有一个玩家知道其他任何玩家的存在,玩家与玩家之间的耦合关系已经完全解除,某个玩家的任何操作都不需要通知其他玩家,而只需要给中介者发送一个消息,中介者处理完消息之后会把结果反馈给其他的玩家对象

总结:中介者模式,以中介者和对象之间的一对多关系取代了对象之间的网状多对多的关系,各个对象只需要关注自身功能实现,对象之间的交互关系交给了中介者对象来维护,不过中介者模式也存在一些缺点,其中最大的缺点就是新增一个中介者对象,因为对象之间的交互复杂性转移成了中介者对象的复杂性,使得中介者对象经常是巨大的。中介者对象往往都是一个很难维护的对象

上一篇 下一篇

猜你喜欢

热点阅读