MeloGuo, design pattern
Back

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

中止迭代器

在内部迭代器中使用 break 即可中止迭代。 在外部迭代器中添加一个return方法,调用后即可中止迭代器。

JS 中的外部迭代器

调用生成器函数即可获得迭代器,迭代器拥有三个方法为next returnthrow。调用next方法即可让迭代器内部进行一次迭代(即从当前yield运行到下一次yield),同时返回一个对象含有valuedone属性,分别表示此次迭代的返回值和是否迭代结束。

function* gen() {
while (true) {
var value = yield null;
console.log(value);
}
}
var g = gen();
g.next(1);
// "{ value: null, done: false }"
g.next(2);
// 2
// "{ value: null, done: false }"

可迭代对象

Symbol.iterator

应用实例

const getActiveUploadObj = function () {
try {
return new ActiveXObject("xxxxx");
} catch (e) {
return false;
}
};
const getFlashUploadObj = function () {
if (supportFlash()) {
// return xxxx
}
return false;
};
const getFormUploadObj = function () {
// return xxxx
};

所以迭代器需要做下面几步工作。

const iteratorUploadObj = function (...args) {
for (let i = 0; i < args.length; i++) {
let uploadObj = args[i]();
if (uploadObj !== false) {
return uploadObj;
}
}
};
const uploadObj = iteratorUploadObj(
getActiveUploadObj,
getFlashUploadObj,
getFormUploadObj
);

这样当以后想要拓展新方法时只需要编写遵循规则的获取 uploadObj 的函数然后将其放入参数即可,能够很方便地维护和拓展代码。像这种需要大量分支判断的需求便可以优雅的通过迭代器模式来实现。

著作权声明

本文作者 郭梓梁,首次发布于 MeloGuo Blog,转载请保留以上链接


GitHub · guoziliang199606@gmail.com · 微信
CC BY-NC 4.0 © Melo Guo.RSS