迭代器模式,内部和外部迭代器举例(设计模式与开发实践 P7)

文章目录

迭代器模式

定义:提供一种方法 顺序访问 聚合元素中的各个元素,而不需要暴露对象的内部表示

迭代器模式可以把迭代的过程从业务逻辑中分离出来

实现

我们可以使用 JavaScript 实现一个最简化的 迭代器 模型

javascript 复制代码
var each = function (arr, callback) {
  for (var i = 0; i < arr.length; i++) {
    callback(arr[i]);
  }
};

each([1, 2, 3], function (i) {
  console.log(i + 10);
});

内部迭代器

上面就是一个内部迭代器,迭代规则在内部定义,迭代器完全接手数据迭代,只需要调用一次就可以完成迭代

外部迭代器

外部迭代器必须 显式请求 迭代下一个元素,增加了调用的复杂度和灵活性

外部迭代器通过实现 Iterator 类帮助进行聚合元素的迭代

javascript 复制代码
var Iterator = function (obj) {
  var current = 0; // 内部指针
  var next = function () {
    // 遍历下一个
    current += 1;
  };
  var isDone = function () {
    // 判断是否遍历完毕
    return current >= obj.length;
  };
  var getCurrItem = function () {
    // 返回当前元素
    return obj[current];
  };
  return {
    next: next,
    isDone: isDone,
    getCurrItem: getCurrItem,
  };
};

var list = [1, 2, 3];
var iterator = Iterator(list); // 获取迭代器
while (!iterator.isDone()) {
  console.log(iterator.getCurrItem() + 10); // 输出当前值 + 10
  iterator.next(); // 迭代下一个
}

迭代 - 类数组 & 字面量对象

迭代器模式还可以迭代 arguments、字典 之类的对象

中止迭代器

通过判断 callback == true / false 来执行 break 中止迭代器也是有效的

相关推荐
liangshanbo12155 分钟前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once1 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
geovindu2 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
默_笙3 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript
Dovis(誓平步青云)4 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
xieter4 小时前
【技术精选】TypeScript 高级类型体操:条件类型与模板字面量深度剖析 (2026-10-06)
javascript
ss2734 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
CappuccinoRose5 小时前
输入事件进阶
前端·javascript·输入事件
500847 小时前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
米多科技7 小时前
让 AI 走进我的 3D 世界:一个 MCP server 的完整实现
javascript