JavaScript设计模式:迭代器模式

迭代器模式

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

作用:迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器之后,即使不关心对象的内部构造,也可以按顺序访问其中的每一个元素

一个简单的迭代器

const each = function (arg, callback) {
  for (var i = 0; i < arg.length; i++) {
    callback.call(arg, i, arg[i])
  }
}
each(["vvvv", 'jop', 'loi'], function (i, item) {
  console.log('this', this);
  console.log(i, item)
})

在这里插入图片描述

迭代器的分类

内部迭代器

优点:调用的时候非常的方便,外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始化调用
缺点:由于内部迭代器的迭代规则已经被提前规定,上面的函数就无法同时迭代2个数组了

外部迭代器

定义:外部迭代器必须显式地去请求下一个元素
缺点:增加了调用的复杂度
优点:增强了迭代器的灵活性,可以手工控制的带的过程或者顺序

const Iterator = function (obj) {
  let current = 0;

  const next = function () {
    current += 1;
  }

  const isDone = function () {
    return current >= obj.length;
  }

  const getCurrentItem = function () {
    return obj[current];
  }

  return {
    next,
    isDone,
    getCurrentItem
  }
}

const compare1 = function (iterator1, iterator2) {
  while (!iterator1.isDone() && !iterator2.isDone()) {
    if (iterator1.getCurrentItem() !== iterator2.getCurrentItem()) {
      throw new Error('两个数组不相等');
    }
    iterator1.next();
    iterator2.next();
  }
  console.log('两数组相等');
}

const iterator1 = Iterator([1, 2, 3]);
const iterator2 = Iterator([1, 2, 3]);
console.log('iterator1', iterator1);
console.log('iterator2', iterator2);

compare1(iterator1, iterator2);

在这里插入图片描述

迭代器模式的应用场景

当多种方法执行需要优先及时可使用迭代器,当满足条件时终止迭代(即跳出循环)

本例子只是说明函数的执行顺序,优先级高的先执行,满足要求即推出,不满足则继续往下执行。

const GoF = () => {
  let flag = ''
  let res = false;
  if (flag) {
    res = true;
  }
  return res;
}

const GoT = () => {
  let flag = 'GoT'
  let res = false;
  if (flag) {
    res = true;
  }
  return res;
}

const GoTh = () => {
  let flag = 'GoT'
  let res = false;
  if (flag) {
    res = true;
  }
  return res;
}

const Iterator = function () {
  for (let i = 0, fn; fn = arguments[i++];) {
    let flag = fn();
    console.log('flag',flag);
    if(flag) return;
  }
}
Iterator(GoF,GoT,GoTh)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值