轻松掌握JavaScript中介者模式

 更新时间:2016年08月26日 09:25:22   投稿:lijiao  
这篇文章主要帮助大家轻松掌握JavaScript中介者模式,告诉大家什么是js中介者模式?js中介者模式的作用是什么,感兴趣的小伙伴们可以参考一下

中介者模式的作用就是解除对象与对象之间的紧耦合关系,它也称‘调停者'。所有的对象都通过中介者对象来通信,而不是相互引用,所以当一个对象发生改变时,只需要通知中介者即可。 

如:机场的指挥塔,每架飞机都只需要和指挥塔通信即可,指挥塔知道每架飞机的飞行状况,可以安排所有起降时间,调整航线等 

中介者模式符合迪米特法则,即最少知识原则,指一个对象应该尽可能少地了解另外的对象。如果对象之间的耦合性太高,则改变一个对象,会牵动很多对象,难于维护。当对象耦合很紧时,要修改一个对象而不影响其它的对象是很困难的。 

如果对象之间的复杂耦合确实导致调用和维护出现了困难,而且这些耦合度随项目的变化呈指数增长,那我们就可以考虑用中介者模式来重构代码!中介者通过解耦来提升代码的可维护性。 

例子1:游戏 
玩家对象是通过Player()构造函数来创建的,有自己的points和name属性。原型上的play()方法负责给自己加一分然后通知中介者:

 function Player(name) {
  this.points = 0;
  this.name = name;
}
Player.prototype.play = function () {
  this.points += 1;
  mediator.played();
}; 

scoreboard对象(计分板)有一个update()方法,它会在每次玩家玩完后被中介者调用。计分析根本不知道玩家的任何信息,也不保存分数,它只负责显示中介者给过来的分数:

 var scoreboard = {
  element: document.getElementById('results'),
  update: function (score) {
    var i, msg = '';
    for (i in score) {
      if (score.hasOwnProperty(i)) {
        msg += '<p><strong>' + i + '<\/strong>: ';
        msg += score[i];
        msg += '<\/p>';
      }
    }
    this.element.innerHTML = msg;
  }
}; 

现在我们来看一下mediator对象(中介者)。在游戏初始化的时候,在setup()方法中创建游戏者,然后放后players属性以便后续使用。played()方法会被游戏者在每轮玩完后调用,它更新score哈希然表然后将它传给scoreboard用于显示。最后一个方法是keypress(),负责处理键盘事件,决定是哪位玩家玩的,并且通知它:

 var mediator = {
  players: {},
  setup: function () {
    var players = this.players;
    players.home = new Player('Home');
    players.guest = new Player('Guest');
  },
  played: function () {
    var players = this.players,
    score = {
      Home: players.home.points,
      Guest: players.guest.points
    };
    scoreboard.update(score);
  },
  keypress: function (e) {
    e = e || window.event; // IE
    if (e.which === 49) { // key "1"
      mediator.players.home.play();
      return;
    }
    if (e.which === 48) { // key "0"
      mediator.players.guest.play();
      return;
    }
  }
}; 

最后一件事是初始化和结束游戏:

 // go!
mediator.setup();
window.onkeypress = mediator.keypress;

// game over in 30 seconds
setTimeout(function () {
  window.onkeypress = null;
  alert('Game over!');
}, 30000); 

例子2:卖手机

 var goods = {  //库存
  'red|32G':3,
  'red|16G':5,
  'blue|32G':3,
  'blue|16G':6
}
//中介者
var mediator = (function(){
  function id(id){
    return document.getElementById(id);
  }
  var colorSelect = id('colorSelect'),
    memorySelect = id('memorySelect'),
    numberInput = id('numberInput'),
    colorInfo = id('colorInfo'),
    memoryInfo = id('memoryInfo'),
    numberInfo = id('numberInfo'),
    nextBtn = id('nextBtn');
  return{
    changed:function(obj){
      var color = colorSelect.value,
        memory = memorySelect.value,
        number = numberInput.value,
        stock = goods[color+'|'+memory];
      if(obj === colorSelect){
        colorInfo.innerHTML = color;
      }else if(obj === memorySelect){
        memoryInfo.innerHTML = memory;
      }else if(obj === numberInput){
        numberInfo.innerHTML = number;
      }
      if(!color){
        nextBtn.disabled = true;
        nextBtn.innerHTML = '请选择手机颜色';
        return;
      }
      if(!memory){
        nextBtn.disabled = true;
        nextBtn.innerHTML = '请选择内存大小';
        return;
      }
      if(Number.isInteger(number-0) && number > 0){
        nextBtn.disabled = true;
        nextBtn.innerHTML = '请输入正确的购买数量';
        return;
      }
      nextBtn.disabled = false;
      nextBtn.innerHTML = '放入购物车';
    }
  }
})();
//添加事件
colorSelect.onchange = function(){
  mediator.changed(this);
}
memorySelect.onchange = function(){
  mediator.changed(this);
}
numberInput.onchange = function(){
  mediator.changed(this);
} 

参考文献: 《JavaScript模式》 《JavaScript设计模式与开发实践》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • window.addeventjs事件驱动函数集合addEvent等

    window.addeventjs事件驱动函数集合addEvent等

    addEvent()、removeEvent()、handleEvent()、fixEvent()[
    2008-02-02
  • canvas实现动态小球重叠效果

    canvas实现动态小球重叠效果

    在javascript运动系列中,详细介绍了各种运动,其中就包括碰壁运动。但是,如果用canvas去实现,却是另一种思路。本文将详细介绍canvas动态小球重叠效果。下面跟着小编一起来看下吧
    2017-02-02
  • JavaScript中string对象

    JavaScript中string对象

    和JAVA中String对象用处一样啊,javascript中的String对象也有自己的方法,和JAVA中的类似。
    2015-06-06
  • JavaScript中split与join函数的进阶使用技巧

    JavaScript中split与join函数的进阶使用技巧

    这篇文章主要介绍了JavaScript中split与join函数的进阶使用技巧,split和join通常被用来操作数组和字符串之间的转换,需要的朋友可以参考下
    2016-05-05
  • 轻松理解JavaScript之AJAX

    轻松理解JavaScript之AJAX

    本文主要介绍了JavaScript中的AJAX的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • JSONP基础知识详解

    JSONP基础知识详解

    JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,是应用JSON的一种新方法,常用于务器与客户端跨源通信,在后来的Web服务中非常流行。本文将详细介绍JSONP,下面跟着小编一起来看下吧
    2017-03-03
  • webpack 静态资源集中输出的方法示例

    webpack 静态资源集中输出的方法示例

    这篇文章主要介绍了webpack 静态资源集中输出的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • JavaScript组件开发完整示例

    JavaScript组件开发完整示例

    这篇文章主要介绍了JavaScript组件开发的方法,结合完整实例形式分析了组件的原理与实现技巧,代码包含的详尽的注释,便于理解,需要的朋友可以参考下
    2015-12-12
  • 使用微信小程序开发前端【快速入门】

    使用微信小程序开发前端【快速入门】

    本文从代码角度和宏观角度简单阐述了微信小程序在前端领域的一些内容和影响,希望能够帮助那些不了解微信小程序的开发者很快入门并认识这一新的技术领域。
    2016-12-12
  • 基于javascript实现数字英文验证码

    基于javascript实现数字英文验证码

    这篇文章主要为大家详细介绍了javascript实现数字英文验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论