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

这篇具有很好参考价值的文章主要介绍了【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。

迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,就可以引入迭代器模式,给我们的容器实现一个迭代器。

 

作用

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

 

实现步骤

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

 

UML

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

 

 

Java代码

 

迭代器抽象接口

 

// Iterator.java 迭代器抽象接口,提供next和hasNext方法
public interface Iterator {
   public boolean hasNext();
   public Object next();
}

 

 

具体迭代器

 

// ObjectIterator.java 对象迭代器,实现了抽象迭代器的方法,聚合了对象列表
public class ObjectIterator implements Iterator {

   private ObjectList objectList;

   int index;

   public ObjectIterator(ObjectList objectList) {
      this.objectList = objectList;
   }

   @Override
   public boolean hasNext() {
      if (index < objectList.size()) {
         return true;
      }
      return false;
   }

   @Override
   public Object next() {
      if (this.hasNext()) {
         // 返回数据对象提供的get方法,每访问一次则增加下标
         return objectList.get(index++);
      }
      return null;
   }
}
 

 

数据容器接口

 

// Container.go 创建抽象容器接口,创建一个迭代器
public interface Container {
   public Iterator createIterator();
}

 

 

具体数据对象

 

// ObjectList.java 对象列表,是一种数据容器,可以创建一个迭代器
public class ObjectList implements Container {
   private Object[] objects = { "Google", "Apple", "Amazon" };

   @Override
   public Iterator createIterator() {
      System.out.println(this.getClass().getName() + "::createIterator() [获取迭代器 ObjectIterator]");
      // 把当前对象传给迭代器
      return new ObjectIterator(this);
   }

   public void setObjects(Object[] objects) {
      this.objects = objects;
   }

   public int size() {
      return objects.length;
   }

   public Object get(int index) {
      return objects[index];
   }
}
 

 

测试调用

 

    /*
     * 迭代器模式是给数据容器创建单独的迭代器,用来遍历里面的数据对象
     * 数据容器和迭代器相互关联,外部通过迭代器来访问数据容器
     * 通过这种方式由迭代器类来负责数据遍历,这样可以做到不暴露集合的内部结构
     */

    int i = 0;
    ObjectList objectList = new ObjectList();
    objectList.setObjects(new String[] { "Thomas", "Merry", "Jack", "Tony", "Jerry", "Joey" });
    // for循环迭代对象
    for (Iterator iter = objectList.createIterator(); iter.hasNext();) {
      String name = (String) iter.next();
      System.out.println("objectList[" + i + "] = " + name);
      i++;
    }

    // while循环迭代对象
    Iterator iter2 = objectList.createIterator();
    objectList.setObjects(new Integer[] { 3, 5, 7, 9, 11 });
    while (iter2.hasNext()) {
      System.out.println(iter2.next());
    }
 

 

Go代码

 

迭代器抽象接口

 

// Iterator.go 迭代器抽象接口,提供next和hasNext方法
type Iterator interface {
  HasNext() bool
  Next() string
}

 

 

具体迭代器

 

// ObjectIterator.go 对象迭代器,实现了抽象迭代器的方法,聚合了对象列表
type ObjectIterator struct {
  // 迭代器索引
  index int
  // 聚合了数据对象
  objectList *ObjectList
}

func (o *ObjectIterator) HasNext() bool {
  if o.index < o.objectList.Size() {
    return true
  }
  return false
}

func (o *ObjectIterator) Next() string {
  if o.HasNext() {
    // 返回数据对象提供的get方法,每访问一次下标增加1位
    item := o.objectList.Get(o.index)
    o.index += 1
    return item
  }
  return ""
}

 

 

数据容器接口

 

// Container.go 创建抽象容器接口,创建一个迭代器
type Container interface {
  CreateIterator() Iterator
}

 

 

具体数据对象

 

// ObjectList.go 对象列表,是一种数据容器,可以创建一个迭代器
type ObjectList struct {
  // 内部的数据结构
  objects []string
}

func (o *ObjectList) CreateIterator() Iterator {
  fmt.Println("ObjectList::CreateIterator() [获取迭代器 ObjectIterator]")
  // 创建迭代器实例,绑定新建当前对象
  return &ObjectIterator{
    objectList: o,
  }
}

func (o *ObjectList) SetObjects(objects []string) {
  o.objects = objects
}

func (o *ObjectList) GetObjects() []string {
  return o.objects
}

func (o *ObjectList) Size() int {
  return len(o.objects)
}

func (o *ObjectList) Get(index int) string {
  return o.objects[index]
}
 

 

测试调用

 

    /*
     * 迭代器模式是给数据容器创建单独的迭代器,用来遍历里面的数据对象
     * 数据容器和迭代器相互关联,外部通过迭代器来访问数据容器
     * 通过这种方式由迭代器类来负责数据遍历,这样可以做到不暴露集合的内部结构
     */

    int i = 0;
    ObjectList objectList = new ObjectList();
    objectList.setObjects(new String[] { "Thomas", "Merry", "Jack", "Tony", "Jerry", "Joey" });
    // for循环迭代对象
    for (Iterator iter = objectList.createIterator(); iter.hasNext();) {
      String name = (String) iter.next();
      System.out.println("objectList[" + i + "] = " + name);
      i++;
    }

    // while循环迭代对象
    Iterator iter2 = objectList.createIterator();
    objectList.setObjects(new Integer[] { 3, 5, 7, 9, 11 });
    while (iter2.hasNext()) {
      System.out.println(iter2.next());
    }
 

 

C语言简版

 

#include <stdio.h>
#include <stdlib.h>

// 简单版C语言迭代器模式,自己构建List数据类型

// 数据结构,这里使用链表作为示例
struct List
{
  char *data;
  struct List *next;
};

// 迭代器结构体
struct Iterator
{
  struct List *current;
  int (*has_next)(struct Iterator *);        // 判断是否还有下一个元素
  char *(*next)(struct Iterator *, char **); // 获取下一个元素
};

// 判断是否还有下一个元素
int has_next(struct Iterator *iter)
{
  return iter->current != NULL;
}

// 获取下一个元素
char *next(struct Iterator *iter, char **value)
{
  if (iter->current == NULL)
  {
    return NULL;
  }
  *value = iter->current->data;
  iter->current = iter->current->next;
  return *value;
}

// 初始化迭代器
void create_iterator(struct Iterator *iter, struct List *head)
{
  iter->current = head;
  iter->has_next = &has_next;
  iter->next = &next;
}

// 遍历链表
void iterate_list(struct List *head)
{
  struct Iterator iter;
  char *value;
  create_iterator(&iter, head);
  while (iter.has_next(&iter))
  {
    iter.next(&iter, &value);
    printf("\r\n %s ", value);
  }
  printf("\n");
}

int main()
{
  printf("test start:\r\n");
  // 构造一个链表
  struct List *head = (struct List *)malloc(sizeof(struct List));
  head->data = "Tom";
  head->next = (struct List *)malloc(sizeof(struct List));
  head->next->data = "Jerry";
  head->next->next = (struct List *)malloc(sizeof(struct List));
  head->next->next->data = "Max";
  head->next->next->next = NULL;

  // 使用迭代器遍历链表
  iterate_list(head);

  // 释放链表内存
  while (head != NULL)
  {
    struct List *temp = head;
    head = head->next;
    free(temp);
  }

  return 0;
}

 

 

更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern文章来源地址https://www.toymoban.com/news/detail-416284.html

到了这里,关于【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【享元设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    享元模式(Flyweight Pattern),是一种结构型设计模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。 当程序需要生成数量巨大的相似

    2023年04月10日
    浏览(24)
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法

    2024年02月01日
    浏览(59)
  • 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    观察者模式(Observer Pattern)是一种行为型模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject对象带有绑定观察者到Client对象和从Client对象解绑观察

    2023年04月21日
    浏览(61)
  • 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。 当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩

    2024年02月02日
    浏览(58)
  • 【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    备忘录模式(Memento Pattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。 备忘录模式

    2023年04月20日
    浏览(52)
  • 【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    中介者模式(Mediator Pattern)是一种行为型模式。它限制对象之间的直接交互,它用一个中介对象来封装一系列的动作,以让对象之间进行交流。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 当一些对象和其他对象紧密

    2023年04月19日
    浏览(27)
  • 【解释器设计模式详解】C/Java/Go/JS/TS/Python不同语言实现

    解释器模式(Interpreter Pattern)是一种行为型设计模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式常被用在 SQL 解析、符号处理引擎等。 解释器模式常用于对简单语言的编译或分析实例中,为了掌握好它的结构与实现,必须先了解编译原理中的

    2023年04月12日
    浏览(25)
  • 【Design Pattern 23种经典设计模式源码大全】C/Java/Go/JS/Python/TS等不同语言实现

    经典设计模式源码详解,用不同语言来实现,包括Java/JS/Python/TypeScript/Go等。结合实际场景,充分注释说明,每一行代码都经过检验,确保可靠。 设计模式是一个程序员进阶高级的必然选择,不懂设计模式,就像写文章不懂得层次,盖房子没有结构。只有充分懂得设计之道,

    2023年04月11日
    浏览(27)
  • Java 设计模式——迭代器模式

    迭代器模式 (Iterator Pattern) 是一种行为型设计模式, 它提供一种顺序访问聚合对象(如列表、集合等)中的元素,而无需暴露聚合对象的内部表示 。迭代器模式将遍历逻辑封装在一个 迭代器对象 中,使得我们可以使用统一的方式遍历不同类型的聚合对象,同时也可以简化客

    2024年02月16日
    浏览(27)
  • 津津乐道设计模式 - 迭代器模式详解(以购物车的场景来演示迭代器模式)

    😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门

    2024年02月16日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包