JavaScript设计模式 -迭代器模式

1. 迭代器模式的简单理解

定义:迭代器模式是指提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 好处:迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器之后,即使不关心对象的内部构造,也可以按顺序访问其中的每一个元素

一个简单的迭代器

const each = function(arg, callback) {
          
   
   for(var i = 0; i < arg.length; i++) {
          
   
        callback(i, arg[i])
    }
}
each([1, 2, 3], function(i, item) {
          
   
    console.log(i, i, item)
})

2. 迭代器的分类

  1. 内部迭代器
  2. 外部迭代器

2.1 内部迭代器

上面实现的简单迭代器each函数属于内部迭代器,each函数的内部已经定义好了迭代规则,他完全接手了整个迭代过程,外部只需要一次初始化调用

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

使用内部迭代器进行两个数组的比较

const compare = function(arg1, arg2) {
          
   
     if(arg1.length !== arg2.length) {
          
   
         throw new Error(两个数组不相等)
     }
     each(arg1, function(i, n) {
          
   
         if(n !== arg2[i]) {
          
   
             throw new Error(两个数组不相等)
         }
     })
     console.log(两数组相等)
 }

 compare([1, 2, 3], [1, 2, 3])

2.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])

compare1(iterator1, iterator2)

3. 总结

迭代器模式是一种相对简单的模式,简单到很多时候都不认为他是一种设计模式。目前绝大部分语言都内置了迭代器

经验分享 程序员 微信小程序 职场和发展