迭代器模式
定义:迭代器模式是指提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
作用:迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器之后,即使不关心对象的内部构造,也可以按顺序访问其中的每一个元素
一个简单的迭代器
const each = function (arg, callback) {
for (var i = 0; i < arg.length; i++) {
callback.call(arg, i, arg[i])
}
}
each(["vvvv", 'jop', 'loi'], function (i, item) {
console.log('this', this);
console.log(i, item)
})
迭代器的分类
内部迭代器
优点:调用的时候非常的方便,外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始化调用
缺点:由于内部迭代器的迭代规则已经被提前规定,上面的函数就无法同时迭代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]);
console.log('iterator1', iterator1);
console.log('iterator2', iterator2);
compare1(iterator1, iterator2);
迭代器模式的应用场景
当多种方法执行需要优先及时可使用迭代器,当满足条件时终止迭代(即跳出循环)
本例子只是说明函数的执行顺序,优先级高的先执行,满足要求即推出,不满足则继续往下执行。
const GoF = () => {
let flag = ''
let res = false;
if (flag) {
res = true;
}
return res;
}
const GoT = () => {
let flag = 'GoT'
let res = false;
if (flag) {
res = true;
}
return res;
}
const GoTh = () => {
let flag = 'GoT'
let res = false;
if (flag) {
res = true;
}
return res;
}
const Iterator = function () {
for (let i = 0, fn; fn = arguments[i++];) {
let flag = fn();
console.log('flag',flag);
if(flag) return;
}
}
Iterator(GoF,GoT,GoTh)