关于迭代器模式我所知道的

简介: 关于迭代器模式我所知道的

image.png


迭代器是用来遍历容器的,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。

现在流行的大部分语言都已经有了内置的迭代器实现。本质其实就是循环访问聚合对象中的各个元素。

迭代器可以分为内部迭代器和外部迭代器。


内部迭代器


内部已经定义好了迭代规则,它完全接手整个迭代过程,外部只需要一次初始调用


外部迭代器


外部迭代器必须显式地请求迭代下一个元素。

外部迭代器虽然调用方式相对复杂,但它的适用面更广,也能满足更多变的需求。比如常见的 next()nextTick() 等。


// jq 迭代器
$.each([1, 2, 3], (i, n) => console.log('当前下标为: ' + i, '当前值为:' + n));   
// 简单实现内部迭代器
const each = (arr, cb) => {
  arr.forEach((item, index) => cb.call(item, index, item))
}
each([1, 2, 3], (i, n) => console.log([i, n]));
// 简单应用
const compare = (arr1, arr2) => {
  if (arr1.length !== arr2.length) {
    return false;
  }
  let r = true;
  each(arr1, (i, n) => {
    if (n !== arr2[i]) {
      r = false
    }
  })
  return r
}
// 简单实现外部迭代器
class Iterator {
  constructor(obj) {
    this.current = 0;
    this.obj = obj;
    this.length = obj.length;
  }
  next() {
    this.current += 1;
  }
  isDone() {
    return this.current >= this.obj.length;
  }
  getCurItem() {
    return this.obj[this.current];
  }
}
const compare = (iterator1, iterator2) => {
  if (iterator1.length !== iterator2.length) {
    console.log('iterator1和iterator2不相等');
  }
  while (!iterator1.isDone() && !iterator2.isDone()) {
    if (iterator1.getCurItem() !== iterator2.getCurItem()) {
      console.log('iterator1和iterator2不相等')
      return false
    }
    iterator1.next();
    iterator2.next();
  }
  alert('iterator1和iterator2相等');
}
const iterator1 = new Iterator([1,2,3,4])
const iterator2 = new Iterator([1,2,4,4])
compare(iterator1, iterator2)


内部迭代器和外部迭代器在实际生产中没有优劣之分,究竟使用哪个要根据需求场景而定。

拓展应用 倒序迭代器 中止迭代器


// 倒序迭代器
const reverseEach = (arr, cb) => {
  for (let i = arr.length - 1; i >= 0; i--) {
    cb(i, arr[i]);
  }
}
reverseEach([1, 2, 3], (i, n) => console.log(n))
// 中止迭代器 回调函数中包含循环的终止条件
const Each = (arr, cb) => {
  for (let i = 0; i < arr.length; i++) {
    if (cb(i, arr[i]) === false) {
      break
    }
  }
}
Each([1, 2, 3, 4, 5], (i, n) => {
  if (n > 3) { // 中止条件
    return false
  }
  console.log(n) // 1,2,3
})


目录
相关文章
|
7月前
|
设计模式 uml C++
行为型 迭代器模式
行为型 迭代器模式
45 0
|
设计模式 存储 算法
设计模式~迭代器模式(Iterator)-20
迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。迭代器模式已经被淘汰,java中已经把迭代器运用到各个聚集类(collection)中了,使用java自带的迭代器就已经满足我们的需求了 目录 迭代器模式(Iterator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项 (5)应用实例: 代码
60 0
|
设计模式 存储 Java
迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象中每个元素的方法,而不暴露其内部实现。
104 1
|
设计模式 Java 索引
Java设计模式-迭代器模式(Iterator)
Java设计模式-迭代器模式(Iterator)
|
JavaScript 前端开发
简单理解迭代器模式
这几天研究了一下迭代器模式,期间有一段时间经常搞不太懂一些概念与概念之间的关系,今天来整理一下。
133 0
|
设计模式 存储 容器
我学会了,迭代器模式
迭代器模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
104 0
我学会了,迭代器模式
|
设计模式 算法
设计模式之迭代器
设计模式之迭代器
140 0
设计模式之迭代器
|
Java 容器
迭代器模式
迭代器模式
115 0
|
Java uml 容器
被用到炉火纯清的迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
118 0
被用到炉火纯清的迭代器模式
|
设计模式 Java 数据安全/隐私保护
设计模式是什么鬼(迭代器)
设计模式是什么鬼(迭代器)
设计模式是什么鬼(迭代器)