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. 迭代器的分类
- 内部迭代器
- 外部迭代器
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. 总结
迭代器模式是一种相对简单的模式,简单到很多时候都不认为他是一种设计模式。目前绝大部分语言都内置了迭代器