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