前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【地铁上的设计模式】--行为型模式:迭代器模式

【地铁上的设计模式】--行为型模式:迭代器模式

作者头像
喵叔
发布2023-05-09 17:52:43
3480
发布2023-05-09 17:52:43
举报
文章被收录于专栏:喵叔's 专栏喵叔's 专栏
什么是迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种遍历聚合对象中各个元素的方法,而不需要暴露该聚合对象的内部表示。这个模式分离了聚合对象的遍历行为,使得遍历算法能够与聚合对象分离开来,从而可以在不改变聚合对象的情况下定义新的遍历操作。迭代器模式由迭代器接口、具体迭代器类、聚合接口和具体聚合类等组成,其中迭代器接口定义了访问和遍历元素的方法,而聚合接口定义了创建迭代器的方法。迭代器模式的实现可以大大简化遍历聚合对象中元素的代码,同时也可以方便地新增不同类型的迭代器,从而为聚合对象提供不同的遍历行为。

如何实现迭代器模式

迭代器模式的实现步骤如下:

  1. 定义抽象迭代器接口(Iterator),其中包含 hasNext() 和 next() 方法,分别用于判断是否还有下一个元素和获取下一个元素。
  2. 定义抽象聚合接口(Aggregate),其中包含 createIterator() 方法,用于创建对应的迭代器。
  3. 实现具体的聚合类(ConcreteAggregate),实现聚合接口,并实现 createIterator() 方法,返回对应的具体迭代器实例。
  4. 实现具体的迭代器类(ConcreteIterator),实现迭代器接口,实现 hasNext() 和 next() 方法,用于遍历聚合对象中的元素。
  5. 在客户端代码中,通过调用聚合类的 createIterator() 方法获取迭代器实例,并使用迭代器的 hasNext() 和 next() 方法遍历聚合对象中的元素。

迭代器模式的核心思想是将聚合对象与迭代器对象分离,使得聚合对象的内部结构和元素遍历算法可以独立变化,从而提高了代码的灵活性和可维护性。

Java实现 以下是 Java 实现迭代器模式的示例代码:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<String>();
    names.add("Alice");
    names.add("Bob");
    names.add("Charlie");

    Iterator<String> it = names.iterator();
    while (it.hasNext()) {
      String name = it.next();
      System.out.println(name);
    }
  }
}

在这个示例中,我们使用 ArrayList 存储了一些字符串,然后通过调用 iterator() 方法获取到了一个迭代器 it,并使用 while 循环和 hasNext()next() 方法来遍历所有元素并打印它们的值。

Tip:Java 标准库已经提供了迭代器接口 Iterator,所以在实现迭代器模式时可以直接使用标准库提供的接口。如果需要自定义迭代器,只需要实现 Iterator 接口即可。

C#实现 以下是C#实现迭代器模式的示例代码:

代码语言:javascript
复制
using System;
using System.Collections;

// 抽象聚合类
abstract class Aggregate {
    public abstract Iterator CreateIterator();
}

// 具体聚合类
class ConcreteAggregate : Aggregate {
    private ArrayList items = new ArrayList();

    public override Iterator CreateIterator() {
        return new ConcreteIterator(this);
    }

    public int Count {
        get { return items.Count; }
    }

    public object this[int index] {
        get { return items[index]; }
        set { items.Insert(index, value); }
    }
}

// 抽象迭代器类
abstract class Iterator {
    public abstract object First();
    public abstract object Next();
    public abstract bool IsDone();
    public abstract object CurrentItem();
}

// 具体迭代器类
class ConcreteIterator : Iterator {
    private ConcreteAggregate aggregate;
    private int current = 0;

    public ConcreteIterator(ConcreteAggregate aggregate) {
        this.aggregate = aggregate;
    }

    public override object First() {
        return aggregate[0];
    }

    public override object Next() {
        object ret = null;
        if (current < aggregate.Count - 1) {
            ret = aggregate[++current];
        }
        return ret;
    }

    public override bool IsDone() {
        return current >= aggregate.Count;
    }

    public override object CurrentItem() {
        return aggregate[current];
    }
}

// 客户端
class Client {
    static void Main(string[] args) {
        ConcreteAggregate a = new ConcreteAggregate();
        a[0] = "item1";
        a[1] = "item2";
        a[2] = "item3";
        a[3] = "item4";

        Iterator i = a.CreateIterator();
        for (object item = i.First(); !i.IsDone(); item = i.Next()) {
            Console.WriteLine(item);
        }

        Console.ReadLine();
    }
}

其中,Aggregate为抽象聚合类,提供了创建迭代器的抽象方法CreateIterator()ConcreteAggregate为具体聚合类,继承了Aggregate,实现了CreateIterator()方法,同时还包含了一个用于存储聚合元素的ArrayListIterator为抽象迭代器类,提供了获取第一个元素、获取下一个元素、判断是否迭代完成和获取当前元素等抽象方法;ConcreteIterator为具体迭代器类,继承了Iterator,实现了其中的抽象方法,同时持有一个对聚合对象的引用,以便进行迭代操作;Client为客户端类,实例化ConcreteAggregate对象并调用其CreateIterator()方法创建迭代器,然后通过迭代器对聚合对象进行遍历操作。

总结

迭代器模式是一种行为设计模式,它提供了一种简单的方式来访问集合对象中的元素,而不需要暴露集合内部的表示细节。迭代器模式将集合的遍历行为抽象成一个迭代器接口,使得客户端代码可以通过迭代器遍历集合元素。 优点:迭代器模式可以隐藏集合内部的实现细节,从而使得客户端代码可以使用同样的方式遍历不同类型的集合,而不需要关心集合的具体实现。此外,迭代器模式可以简化集合类的接口,减少了集合类与客户端代码之间的耦合度。 缺点:由于迭代器模式会增加额外的类和接口,因此会增加代码的复杂性。此外,迭代器模式可能会降低程序的性能,因为每次访问元素都需要调用迭代器接口。

总体来说,迭代器模式适用于需要遍历集合对象中元素的场景,它可以提高代码的灵活性和可复用性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是迭代器模式
  • 如何实现迭代器模式
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档