# 迭代器模式
什么是
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
# 核心思想
TIP
在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素
# 具体实现
JS 中数组的 map forEach 已经内置了迭代器
[1, 2, 3].forEach(function (item, index, arr) {
console.log(item, index, arr);
});
不过对于对象的遍历,往往不能与数组一样使用同一的遍历代码,我们可以封装一下:
function each(obj, cb) {
var value;
if (Array.isArray(obj)) {
for (var i = 0; i < obj.length; ++i) {
value = cb.call(obj[i], i, obj[i]);
if (value === false) {
break;
}
}
} else {
for (var i in obj) {
value = cb.call(obj[i], i, obj[i]);
if (value === false) {
break;
}
}
}
}
each([1, 2, 3], function (index, value) {
console.log(index, value);
});
each({ a: 1, b: 2 }, function (index, value) {
console.log(index, value);
});
// 0 1
// 1 2
// 2 3
// a 1
// b 2
再来看一个例子——强行地使用迭代器,来了解一下迭代器也可以替换频繁的条件语句,虽然例子不太好,但在其他负责的分支判断情况下,也是值得考虑的:
function getManager() {
var year = new Date().getFullYear();
if (year <= 2000) {
console.log("A");
} else if (year >= 2100) {
console.log("C");
} else {
console.log("B");
}
}
getManager(); // B
将每个条件语句拆分出逻辑函数,放入迭代器中迭代
function year2000() {
var year = new Date().getFullYear();
if (year <= 2000) {
console.log("A");
}
return false;
}
function year2100() {
var year = new Date().getFullYear();
if (year >= 2100) {
console.log("C");
}
return false;
}
function year() {
var year = new Date().getFullYear();
if (year > 2000 && year < 2100) {
console.log("B");
}
return false;
}
function iteratorYear() {
for (var i = 0; i < arguments.length; ++i) {
var ret = arguments[i]();
if (ret !== false) {
return ret;
}
}
}
var manager = iteratorYear(year2000, year2100, year); // B
← 外观模式
大厂最新技术学习分享群
微信扫一扫进群,获取资料
X