JavaScript的常见设计模式——迭代器模式

定义

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

核心

在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素

优缺点

优点

  • 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
  • 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
  • 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
  • 当要展示一组相似对象,或者遍历一组相同对象时使用,适合使用迭代器模式。
     

缺点

每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类。

实现

JS中数组的map forEach 已经内置了迭代器

   function each(obj, cb) {
      let value
      if (Array.isArray(obj)) {
        for (let i = 0; i < obj.length; ++i) {
          value = cb.call(obj[i], i, obj[i])
          if (value === false) {
            break;
          }
        }
      } else {
        for (let i in obj) {
          value = cb.call(obj[i], i, obj[i])
          if (value === false)
            break
        }
      }
    }
    each([1, 2, 3], function (index, value) {
      console.log(index, value);
    });

    each({ a: 1, b: 2 }, function (index, value) {
      console.log(index, value);
    });

运行结果

64dc6f8c514441e18c83c0bf8ec056a1.png

了解一下迭代器也可以替换频繁的条件语句

    function year2000() {
      let year = new Date().getFullYear();
      if (year <= 2000) {
        console.log('A');
      }
      return false;
    }

    function year2100() {
      let year = new Date().getFullYear();
      if (year >= 2100) {
        console.log('C');
      }

      return false;
    }

    function year() {
      let year = new Date().getFullYear();
      if (year > 2000 && year < 2100) {
        console.log('B');
      }
      return false;
    }

    function iteratorYear() {
      for (let i = 0; i < arguments.length; ++i) {
        let ret = arguments[i]();
        if (ret !== false) {
          return ret;
        }
      }
    }
    let manager = iteratorYear(year2000, year2100, year); // B

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值