zoukankan      html  css  js  c++  java
  • JS设计模式(4)迭代器模式

    什么是迭代器模式?

    定义:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

    主要解决:不同的方式来遍历整个整合对象。

    何时使用:遍历一个聚合对象。

    如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。

    关键代码:定义接口:done, next。

    优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。

    注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

    实现一个内部的迭代器

    function each(arr, fn) {
        for (let i = 0; i < arr.length; i++) {
            fn(i, arr[i])
        }
    }
    
    each([1, 2, 3], function(i, n) {
        console.log(i) // 0 1 2
        console.log(n) // 1 2 3
    })

    可以看出内部迭代器在调用的时候非常简单,使用者不用关心迭代器内部实现的细节,但这也是内部迭代器的缺点。比如要比较两数组是否相等,只能在其回调函数中作文章了,代码如下:

    const compare = function(arr1, arr2) {
        each(arr1, function(i, n) {
            if (arr2[i] !== n) {
                console.log('两数组不等')
                return
            }
        })
        console.log('两数组相等')
    }
    
    const arr1 = [1, 2, 3]
    const arr2 = [1, 2, 3]
    compare(arr1, arr2) // 两数组相等

    实现一个外部的迭代器

    const iterator = function(arr) {
      let current = 0
      const next = function() {
        current = current + 1
      }
      const done = function() {
        return current >= arr.length
      }
      const value = function() {
        return arr[current]
      }
      return {
        next,
        done,
        value,
      }
    }
    
    const arr1 = [1, 2 ,3]
    const arr2 = [1, 2, 3]
    const iterator1 = iterator(arr1)
    const iterator2 = iterator(arr2)
    
    const compare = function(iterator1, iterator2) {
      while (!iterator1.done() && !iterator2.done()) {
        if (iterator1.value() !== iterator2.value()) {
          console.log('两数组不等')
          return
        }
        iterator1.next() // 外部迭代器将遍历的权利转移到外部
        iterator2.next()
      }
      console.log('两数组相等')
    }
    
    compare(iterator1, iterator2)
  • 相关阅读:
    【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
    【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】
    【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
    IMemoryBufferReference and IMemoryBufferByteAccess
    SoftwareBitmap and BitmapEncoder in Windows.Graphics.Imaging Namespace
    Windows UPnP APIs
    编译Android技术总结
    Windows函数转发器
    Two Ways in Delphi to Get IP Address on Android
    Delphi Call getifaddrs and freeifaddrs on Android
  • 原文地址:https://www.cnblogs.com/wuguanglin/p/IteratorPattern.html
Copyright © 2011-2022 走看看