找回密码
 立即注册
首页 业界区 业界 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言 ...

【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

映各 2025-6-6 09:47:33
简介

迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。
迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,就可以引入迭代器模式,给我们的容器实现一个迭代器。
 
作用


  • 可以提供多种遍历对象的方式,把元素之间查找调用的责任交给迭代器,而不是聚合对象。
  • 分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
 
实现步骤


  • 创建迭代器接口,定义hasNext()和next()方法
  • 创建数据容器接口,用来创建迭代器
  • 创建具体数据列表,实现数据容器接口,可以创建迭代器,内含数据列表对象
  • 创建某种数据对象的迭代器,实现hasNext()以及next()方法,并且关联上数据对象列表
 
UML

1.png
 
 
Java代码

 
迭代器抽象接口
  1. // Iterator.java 迭代器抽象接口,提供next和hasNext方法
  2. public interface Iterator {
  3.    public boolean hasNext();
  4.    public Object next();
  5. }
复制代码
 
 
具体迭代器

 
  1. // ObjectIterator.java 对象迭代器,实现了抽象迭代器的方法,聚合了对象列表
  2. public class ObjectIterator implements Iterator {
  3.    private ObjectList objectList;
  4.    int index;
  5.    public ObjectIterator(ObjectList objectList) {
  6.       this.objectList = objectList;
  7.    }
  8.    @Override
  9.    public boolean hasNext() {
  10.       if (index < objectList.size()) {
  11.          return true;
  12.       }
  13.       return false;
  14.    }
  15.    @Override
  16.    public Object next() {
  17.       if (this.hasNext()) {
  18.          // 返回数据对象提供的get方法,每访问一次则增加下标
  19.          return objectList.get(index++);
  20.       }
  21.       return null;
  22.    }
  23. }
复制代码
 
数据容器接口

 
  1. // Container.go 创建抽象容器接口,创建一个迭代器
  2. public interface Container {
  3.    public Iterator createIterator();
  4. }
复制代码
 
 
具体数据对象

 
  1. // ObjectList.java 对象列表,是一种数据容器,可以创建一个迭代器
  2. public class ObjectList implements Container {
  3.    private Object[] objects = { "Google", "Apple", "Amazon" };
  4.    @Override
  5.    public Iterator createIterator() {
  6.       System.out.println(this.getClass().getName() + "::createIterator() [获取迭代器 ObjectIterator]");
  7.       // 把当前对象传给迭代器
  8.       return new ObjectIterator(this);
  9.    }
  10.    public void setObjects(Object[] objects) {
  11.       this.objects = objects;
  12.    }
  13.    public int size() {
  14.       return objects.length;
  15.    }
  16.    public Object get(int index) {
  17.       return objects[index];
  18.    }
  19. }
复制代码
 
测试调用

 
  1.     /*
  2.      * 迭代器模式是给数据容器创建单独的迭代器,用来遍历里面的数据对象
  3.      * 数据容器和迭代器相互关联,外部通过迭代器来访问数据容器
  4.      * 通过这种方式由迭代器类来负责数据遍历,这样可以做到不暴露集合的内部结构
  5.      */
  6.     int i = 0;
  7.     ObjectList objectList = new ObjectList();
  8.     objectList.setObjects(new String[] { "Thomas", "Merry", "Jack", "Tony", "Jerry", "Joey" });
  9.     // for循环迭代对象
  10.     for (Iterator iter = objectList.createIterator(); iter.hasNext();) {
  11.       String name = (String) iter.next();
  12.       System.out.println("objectList[" + i + "] = " + name);
  13.       i++;
  14.     }
  15.     // while循环迭代对象
  16.     Iterator iter2 = objectList.createIterator();
  17.     objectList.setObjects(new Integer[] { 3, 5, 7, 9, 11 });
  18.     while (iter2.hasNext()) {
  19.       System.out.println(iter2.next());
  20.     }
复制代码
 
Go代码

 
迭代器抽象接口

 
  1. // Iterator.go 迭代器抽象接口,提供next和hasNext方法
  2. type Iterator interface {
  3.   HasNext() bool
  4.   Next() string
  5. }
复制代码
 
 
具体迭代器

 
  1. // ObjectIterator.go 对象迭代器,实现了抽象迭代器的方法,聚合了对象列表
  2. type ObjectIterator struct {
  3.   // 迭代器索引
  4.   index int
  5.   // 聚合了数据对象
  6.   objectList *ObjectList
  7. }
  8. func (o *ObjectIterator) HasNext() bool {
  9.   if o.index < o.objectList.Size() {
  10.     return true
  11.   }
  12.   return false
  13. }
  14. func (o *ObjectIterator) Next() string {
  15.   if o.HasNext() {
  16.     // 返回数据对象提供的get方法,每访问一次下标增加1位
  17.     item := o.objectList.Get(o.index)
  18.     o.index += 1
  19.     return item
  20.   }
  21.   return ""
  22. }
复制代码
 
 
数据容器接口

 
  1. // Container.go 创建抽象容器接口,创建一个迭代器
  2. type Container interface {
  3.   CreateIterator() Iterator
  4. }
复制代码
 
 
具体数据对象

 
  1. // ObjectList.go 对象列表,是一种数据容器,可以创建一个迭代器
  2. type ObjectList struct {
  3.   // 内部的数据结构
  4.   objects []string
  5. }
  6. func (o *ObjectList) CreateIterator() Iterator {
  7.   fmt.Println("ObjectList::CreateIterator() [获取迭代器 ObjectIterator]")
  8.   // 创建迭代器实例,绑定新建当前对象
  9.   return &ObjectIterator{
  10.     objectList: o,
  11.   }
  12. }
  13. func (o *ObjectList) SetObjects(objects []string) {
  14.   o.objects = objects
  15. }
  16. func (o *ObjectList) GetObjects() []string {
  17.   return o.objects
  18. }
  19. func (o *ObjectList) Size() int {
  20.   return len(o.objects)
  21. }
  22. func (o *ObjectList) Get(index int) string {
  23.   return o.objects[index]
  24. }
复制代码
 
测试调用

 
  1.     /*
  2.      * 迭代器模式是给数据容器创建单独的迭代器,用来遍历里面的数据对象
  3.      * 数据容器和迭代器相互关联,外部通过迭代器来访问数据容器
  4.      * 通过这种方式由迭代器类来负责数据遍历,这样可以做到不暴露集合的内部结构
  5.      */
  6.     int i = 0;
  7.     ObjectList objectList = new ObjectList();
  8.     objectList.setObjects(new String[] { "Thomas", "Merry", "Jack", "Tony", "Jerry", "Joey" });
  9.     // for循环迭代对象
  10.     for (Iterator iter = objectList.createIterator(); iter.hasNext();) {
  11.       String name = (String) iter.next();
  12.       System.out.println("objectList[" + i + "] = " + name);
  13.       i++;
  14.     }
  15.     // while循环迭代对象
  16.     Iterator iter2 = objectList.createIterator();
  17.     objectList.setObjects(new Integer[] { 3, 5, 7, 9, 11 });
  18.     while (iter2.hasNext()) {
  19.       System.out.println(iter2.next());
  20.     }
复制代码
 
C语言简版

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 简单版C语言迭代器模式,自己构建List数据类型
  4. // 数据结构,这里使用链表作为示例
  5. struct List
  6. {
  7.   char *data;
  8.   struct List *next;
  9. };
  10. // 迭代器结构体
  11. struct Iterator
  12. {
  13.   struct List *current;
  14.   int (*has_next)(struct Iterator *);        // 判断是否还有下一个元素
  15.   char *(*next)(struct Iterator *, char **); // 获取下一个元素
  16. };
  17. // 判断是否还有下一个元素
  18. int has_next(struct Iterator *iter)
  19. {
  20.   return iter->current != NULL;
  21. }
  22. // 获取下一个元素
  23. char *next(struct Iterator *iter, char **value)
  24. {
  25.   if (iter->current == NULL)
  26.   {
  27.     return NULL;
  28.   }
  29.   *value = iter->current->data;
  30.   iter->current = iter->current->next;
  31.   return *value;
  32. }
  33. // 初始化迭代器
  34. void create_iterator(struct Iterator *iter, struct List *head)
  35. {
  36.   iter->current = head;
  37.   iter->has_next = &has_next;
  38.   iter->next = &next;
  39. }
  40. // 遍历链表
  41. void iterate_list(struct List *head)
  42. {
  43.   struct Iterator iter;
  44.   char *value;
  45.   create_iterator(&iter, head);
  46.   while (iter.has_next(&iter))
  47.   {
  48.     iter.next(&iter, &value);
  49.     printf("\r\n %s ", value);
  50.   }
  51.   printf("\n");
  52. }
  53. int main()
  54. {
  55.   printf("test start:\r\n");
  56.   // 构造一个链表
  57.   struct List *head = (struct List *)malloc(sizeof(struct List));
  58.   head->data = "Tom";
  59.   head->next = (struct List *)malloc(sizeof(struct List));
  60.   head->next->data = "Jerry";
  61.   head->next->next = (struct List *)malloc(sizeof(struct List));
  62.   head->next->next->data = "Max";
  63.   head->next->next->next = NULL;
  64.   // 使用迭代器遍历链表
  65.   iterate_list(head);
  66.   // 释放链表内存
  67.   while (head != NULL)
  68.   {
  69.     struct List *temp = head;
  70.     head = head->next;
  71.     free(temp);
  72.   }
  73.   return 0;
  74. }
复制代码
 
 
更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册