javascript - 宣布-观察者形式的小案例

本日我们议论的是宣布-观察者形式,也叫定阅形式,在javascript里,该形式要怎样完成呢,起首我们先看一个现实生活中的例子

小明在事情几年后,预备买房完婚,因而他到售楼处,找售楼职员讯问当前的价钱,得知售楼价每平是小明好几个月工资的时刻,小明犹疑了,因而他归去后,天天都给售楼处打电话,讯问售楼职员的价钱,售楼职员也会耐烦解答,然则第二天又来了一个小芳,因而小芳天天也在打电话,时候久了,人越来越多,售楼职员天天接这么多电话,一定吃不消要跳槽,固然我们只是举例子,现实情况是,售楼职员会留下小明,小芳等等人的电话存在花名册里,这就是定阅,然后等房价降下来的时刻,售楼职员一个个打电话关照他们,如许两边都省了气力,定阅音讯的人也拿到了应得的音讯。如今假定花名册是 clientList <array>, 售楼处是salePart<object>,以此我们写一个简朴宣布-观察者形式的代码

var salePart = {}  // 售楼处
  var clientList = []  // 花名册

  var xiaoming = {
    name: '小明',
    fn: function () {
      var args = [].slice.call(arguments)
      args.unshift(this.name)
      console.log(args.join(','))
    }
  }

  salePart.listen = function (person) {  // 售楼处登记来访者的信息
    clientList.push(person)
  }

  salePart.trigger = function (type, price) {  // 售楼处关照来访者信息,type为售房面积,price为售房价钱
    if (clientList.length > 0) {
      for (var i = 0, person; person = clientList[i++];) {
        if (typeof person.fn === 'function') {
          person.fn(type, price)
        }
      }
    }
  }

  salePart.listen(xiaoming)
  salePart.trigger('square80', 60000)  // 打印出来  小明,square80,60000

下面小芳也要来看房,但是小芳比小明有钱的多,她要看的是200平米的屋子,如许把小芳在增加进去的时刻,售楼处就不能根据分类来举行关照他们的,200平米的屋子的关照小明也能看到,如许小明会更扎心,万一不高兴,就会丧失一个潜伏客户,所以我们还要完美一下上述代码,让售楼处能够根据衡宇面积离别关照对应的买房者

 var salePart = {}  // 售楼处
  var clientList = {}  // 花名册

  var xiaoming = {
    name: '小明',
    type: 's80',
    fn: function () {
      var args = [].slice.call(arguments)
      args.unshift(this.name)
      console.log(args.join(','))
    }
  }

  var xiaofang = {
    name: '小芳',
    type: 's200',
    fn: function () {
      var args = [].slice.call(arguments)
      args.unshift(this.name)
      console.log(args.join(','))
    }
  }

  salePart.listen = function (person) {  // 售楼处登记来访者的信息
    var type = person.type
    if (!clientList[type] || clientList[type].length < 0) {  // 本来的花名册先分类,然后再存入每个人的信息
      clientList[type] = []
    }
    clientList[type].push(person)
  }

  salePart.trigger = function (type, price) {  // 售楼处关照来访者信息,type为售房范例,price为售房价钱
    if (clientList[type] && clientList[type].length > 0) {
      for (var i = 0, person; person = clientList[type][i++];) {
        if (typeof person.fn === 'function') {
          person.fn(type, price)
        }
      }
    }
  }

  salePart.listen(xiaoming)
  salePart.listen(xiaofang)

  salePart.trigger('s80', 60000)  // 打印出来  小明,square80,60000
  salePart.trigger('s200', 200000)  // 打印出来  小芳,square200,200000

能够看到,小明只能吸收到80平米的房价信息,小芳呢,也只能看到200平米的房价信息,如许售楼处又回到了一片欣欣向荣的社会主义调和现象,然则在现实开辟中,上面的代码并不利于保护,由于很松懈,我们能够用对象的体式格局来把代码重构一下

var SalePart = function () {
    this.clientList = {}
  }

  SalePart.prototype.listen = function () {  // 如今我们把该函数处置惩罚为能够一次吸收多个来访者
    var persons = [].slice.call(arguments)

    for (var i = 0, p; p = persons[i++];) {
      var type = p.type
      if (!this.clientList[type] || this.clientList[type].length < 0) {
        this.clientList[type] = []
      }
      this.clientList[type].push(p)
    }
  }

  SalePart.prototype.trigger = function (type, price) {
    if (this.clientList[type] && this.clientList[type].length > 0) {
      for (var i = 0, p; p = this.clientList[type][i++];) {
        if (typeof p.fn === 'function') {
          p.fn(type, price)
        }
      }
    }
  }

  var salePart = new SalePart()
  salePart.listen(xiaoming, xiaofang)
  salePart.trigger('s80', 50000)  // 小明,s80,50000 谢谢党和国家房价终究降了!
  salePart.trigger('s200', 100000)  // 小芳,s200,100000  这么廉价,买买买!!!

以上就是本章的内容,结合现实案例愿望人人看起来更好明白一些,若有疑问,能够在下方留言,看到后我会尽快复兴。

    原文作者:远夏
    原文地址: https://segmentfault.com/a/1190000013899365
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞