迭代器模式(Iterator Pattern)

主要是用于遍历数据,比如迭代链表。在数据过大时亦可像流一样,一点一点来接数据。

迭代器模式的实例

定义生成器,在生成器中定义迭代器,并通过迭代器返回

  1. class NameRepository {
  2. constructor() {
  3. this.names = ["Robert" , "John" ,"Julie" , "Lora"];
  4. }
  5. getIterator() {
  6. const names = this.names;
  7. class NameIterator{
  8. constructor() {
  9. this.index = 0;
  10. }
  11. hasNext() {
  12. if(this.index < names.length){
  13. return true;
  14. }
  15. return false;
  16. }
  17. next() {
  18. if(this.hasNext()){
  19. return names[this.index++];
  20. }
  21. return null;
  22. }
  23. }
  24. return new NameIterator();
  25. }
  26. }

通过生成器和迭代器的方式,即可在for循环中直接遍历数据,如下

  1. console.log("ES5 Iterator:");
  2. const namesRepository = new NameRepository();
  3. for(const iter = namesRepository.getIterator(); iter.hasNext();){
  4. const name = iter.next();
  5. console.log("Name : " + name);
  6. }
  7. /**
  8. * output:
  9. * ES5 Iterator:
  10. * Name : Robert
  11. * Name : John
  12. * Name : Julie
  13. * Name : Lora
  14. */

当然还有ES6的写法,其实很类似,就不详细说了。

  1. // 而在es6中可以这样使用
  2. class NameRepositoryEs6 {
  3. constructor() {
  4. this.names = ["Robert" , "John" ,"Julie" , "Lora"];
  5. this.index = 0;
  6. }
  7. [Symbol.iterator]() {
  8. return {
  9. next: () => {
  10. let done = true;
  11. if(this.index < this.names.length){
  12. done = false;
  13. }
  14. return {value: this.names[this.index++],done};
  15. }
  16. };
  17. }
  18. }
  19. console.log("\nES6 Iterator:");
  20. const namesRepositoryEs6 = new NameRepositoryEs6()
  21. for(const name of namesRepositoryEs6) {
  22. console.log("Name : " + name);
  23. }
  24. /**
  25. * output:
  26. * ES6 Iterator:
  27. * Name : Robert
  28. * Name : John
  29. * Name : Julie
  30. * Name : Lora
  31. */

迭代器模式的优势

通过迭代器的方式可以更方便的遍历有规律的数据,或者是通过迭代器来完成一些流式操作。

上一页(解释器模式)

下一页(中介者模式)