美文网首页
设计模式:中介者模式

设计模式:中介者模式

作者: San十二 | 来源:发表于2018-11-24 23:04 被阅读0次

中介者模式

中介者模式用来接触对象和对象之间的耦合关系。假如现在有一堆同父类的对象之间需要相互通信,每个对象之间都相互通信是一个不好的做法。适合的做法是采用中介者模式,每个对象都只跟中介者进行通信,就像一个星状图。

比赛

假如有10个玩家,5个人一队进行对抗;当某一玩家被击杀时,我们统计该玩家所在的队伍是否还有剩余的人;如果没有,就通知胜方和负方成员。

var Player = function (name, team) {
  this.name = name;
  this.team = team;
  this.state = 'active';
}

Player.prototype.die = function () {
  this.state = 'dead';
  playerDirector.receiveMessage('playerDead', this);
}

我们让玩家本身只保存玩家状态;当玩家被击杀时,向中介者发送消息;这里可以用发布/订阅模式。

生成玩家类的时候,我们也要把队友/敌人的关系确定;这层逻辑不适合加入到玩家的构造函数当中;我们用一个工厂函数来生层这层逻辑。

var createPlayer = function (name, team) {
  var player = new Player(name, team);
  playerDirector.receiveMessage('createPlayer', player);
  return player;
}

最后,我们来写这个中介者。

var playerDirector = (function () {
  
  var players  = {},
      options = {};

  options["createPlayer"] = function (player) {
    var team = player.team;
    players[team] ? players[team].push(player) : players[team] = [player];
  }

  options["playerDead"] = function (player) {
    var team = player.team, teamPlayers = players[team];
    var allDead = true;
    for (var i = 0; i < teamPlayers.length; i++) {
      var teamPlayer = teamPlayers[i];
      if (teamPlayer.state === 'active') {
        allDead = false;
        break;
      }
    }
    if (allDead) {
      // 输出胜负结果
    }
  }

  var receiveMessage = function (type, obj) {
    options[type].apply(this, obj);
  }
  
  return {
    receiveMessage: receiveMessage
  }
})();

相关文章

网友评论

      本文标题:设计模式:中介者模式

      本文链接:https://www.haomeiwen.com/subject/rlduqqtx.html