定义
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
核心
在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素
优缺点
优点
- 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
- 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
- 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
- 当要展示一组相似对象,或者遍历一组相同对象时使用,适合使用迭代器模式。
缺点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类。
实现
JS中数组的map forEach 已经内置了迭代器
function each(obj, cb) {
let value
if (Array.isArray(obj)) {
for (let i = 0; i < obj.length; ++i) {
value = cb.call(obj[i], i, obj[i])
if (value === false) {
break;
}
}
} else {
for (let 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);
});
运行结果
了解一下迭代器也可以替换频繁的条件语句
function year2000() {
let year = new Date().getFullYear();
if (year <= 2000) {
console.log('A');
}
return false;
}
function year2100() {
let year = new Date().getFullYear();
if (year >= 2100) {
console.log('C');
}
return false;
}
function year() {
let year = new Date().getFullYear();
if (year > 2000 && year < 2100) {
console.log('B');
}
return false;
}
function iteratorYear() {
for (let i = 0; i < arguments.length; ++i) {
let ret = arguments[i]();
if (ret !== false) {
return ret;
}
}
}
let manager = iteratorYear(year2000, year2100, year); // B