迭代器模式Iterator Pattern
提供了一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部实现,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据,迭代器模式属于行为型模式。
迭代器模式是针对集合对象而生的,对于集合对象而言,肯定会涉及到对集合的添加和删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作放在集合对象中,但这样的话,集合对象既承担太多的责任了,面向对象设计原则中有一条就是单一职责原则,所有我们要尽可能地分离这些职责,用不同的类取承担不同的责任,迭代器模式就是用迭代器类来承担遍历集合的职责。
// 广播电台示例
class RadioStation { // 电台
constructor(frequency) {
this.frequency = frequency;
}
getFrequency() {
return this.frequency;
}
}
class StationList { // 迭代器
constructor(){
this.index = -1;
this.stations = [];
}
get(i){
return this.stations[this.index];
}
hasNext(){
let index = this.index + 1;
return this.stations[index] !== void 0;
}
next(){
return this.stations[++this.index];
}
addStation(station) {
this.stations.push(station);
}
removeStation(toRemove) {
const toRemoveFrequency = toRemove.getFrequency();
this.stations = this.stations.filter(station => station.getFrequency() !== toRemoveFrequency);
}
}
(function(){
const stationList = new StationList();
stationList.addStation(new RadioStation(89));
stationList.addStation(new RadioStation(101));
stationList.addStation(new RadioStation(102));
stationList.addStation(new RadioStation(103.2));
stationList.stations.forEach(station => console.log(station.getFrequency())); // 89 101 102 103.2
stationList.removeStation(new RadioStation(89));
while(stationList.hasNext()) console.log(stationList.next().getFrequency()); // 101 102 103.2
})();
https://github.com/WindrunnerMax/EveryDay
https://www.cnblogs.com/xuwendong/p/9898030.html
https://www.runoob.com/design-pattern/iterator-pattern.html
https://github.com/sohamkamani/javascript-design-patterns-for-humans#-iterator