首页 > 其他分享 >迭代器模式

迭代器模式

时间:2025-01-16 23:54:37浏览次数:1  
标签:遍历 Iterator 迭代 接口 模式 集合 public

迭代器(Iterator)模式属于行为型模式的一种。

迭代器就是提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

在 Java 中,迭代器模式最常见的实现就是 java.util.Iterator 接口。我们经常在Java的集合类中使用的 Iterator 遍历,就是使用的迭代器模式。java.util.Enumeration 接口,java.util.ListIterator 接口都是迭代器模式的应用。java.util.ListIterator 接口是 Iterator 的增强版,支持双向遍历(hasPrevious()、previous())。

迭代器模式使调用者总是以相同接口遍历不同类型的集合,又保证了调用者对集合内部的数据结构一无所知。这种方式不仅对客户端来说非常方便, 而且能避免客户端在直接与集合交互时执行错误或有害的操作,从而起到保护集合的作用。

迭代器模式的主要思想是将集合的遍历行为抽取为单独的迭代器对象。

迭代器模式通常有以下组成部分: 

  • Iterator(迭代器接口):定义访问和遍历元素的方法。
  • ConcreteIterator(具体迭代器):实现 Iterator 接口,负责具体集合的遍历逻辑,记录遍历的位置。
  • Aggregate(聚合接口):定义创建迭代器的方法。
  • ConcreteAggregate(具体聚合类):实现 Aggregate 接口,提供具体集合的数据存储,并返回相应的迭代器实例。
  • 客户端(Client):使用自定义集合和迭代器。

我们创建一个简单的自定义集合类 MyCollection,以及对应的迭代器。

1、迭代器接口

// 迭代器接口
interface Iterator<T> {
    boolean hasNext(); // 是否还有下一个元素
    T next();          // 获取下一个元素
}

2、聚合接口

// 聚合接口
interface Aggregate<T> {
    Iterator<T> createIterator(); // 创建迭代器
}

3、自定义集合类,类中定义了迭代器内部类

// 自定义集合类
class MyCollection<T> implements Aggregate<T> {
    private T[] items;  // 存储元素的数组
    private int size;   // 当前集合大小

    @SuppressWarnings("unchecked")
    public MyCollection(int capacity) {
        items = (T[]) new Object[capacity];
        size = 0;
    }

    public void add(T item) {
        if (size < items.length) {
            items[size++] = item;
        } else {
            throw new IllegalStateException("Collection is full");
        }
    }

    public int size() {
        return size;
    }

    public T get(int index) {
        if (index >= 0 && index < size) {
            return items[index];
        }
        throw new IndexOutOfBoundsException("Index out of bounds");
    }

    // 返回一个迭代器
    @Override
    public Iterator<T> createIterator() {
        return new MyCollectionIterator();
    }

    // 内部迭代器类
    private class MyCollectionIterator implements Iterator<T> {
        private int currentIndex = 0;

        @Override
        public boolean hasNext() {
            return currentIndex < size; // 判断是否还有元素
        }

        @Override
        public T next() {
            if (hasNext()) {
                return items[currentIndex++]; // 返回当前元素并移动指针
            }
            throw new IllegalStateException("No more elements");
        }
    }
}

4、客户端

public class IteratorPatternDemo {
    public static void main(String[] args) {
        // 创建一个集合
        MyCollection<String> collection = new MyCollection<>(5);
        collection.add("A");
        collection.add("B");
        collection.add("C");
        collection.add("D");

        // 获取集合的迭代器
        Iterator<String> iterator = collection.createIterator();

        // 使用迭代器遍历集合
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

迭代器模式的优缺点。

优点:

  • 统一遍历接口:通过迭代器,可以使用统一的方式遍历不同集合。
  • 隐藏集合内部结构:调用者无需了解集合的实现细节,只需通过迭代器访问元素。
  • 解耦集合与遍历算法:迭代器封装了遍历逻辑,集合类只负责存储数据。

缺点:

  • 如果集合很大,创建迭代器可能会增加额外的开销。
  • 对于简单集合,使用迭代器可能显得复杂。

我们可以使用迭代器模式来遍历组合模式树。

迭代器模式是一种非常实用的设计模式,它解耦了集合对象的存储与访问逻辑,在 Java 中被广泛应用。通过迭代器,程序可以以一种简单而一致的方式操作各种集合对象,而无需关心它们的内部实现。

人生有时真的很残酷,就像在流沙里奔跑,任何一点风吹草动,都足以击垮我们的沙城。-- 烟沙九洲

​  

标签:遍历,Iterator,迭代,接口,模式,集合,public
From: https://www.cnblogs.com/yanshajiuzhou/p/18675941

相关文章

  • C#中的设计模式:构建更加优雅的代码
    C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发......
  • Android 13 14 vpn中怎么实现pptp和l2tp模式
    目录1.背景2.上层逻辑3.Vpn状态同步4.你咋不给我生成state文件5.最终patch1.背景    由于google在Android13中处于安全性考虑,去掉了vpn中的pptp模式和l2tp模式,但是客户有需求还是要在vpn中通过pptp模式和l2tp模式进行vpn连接,所以目前首选方案是将android12......
  • 番外-rust迭代器-iter()
    iter()是Rust中的一个方法,它可以用于可迭代的集合,返回一个不可变的迭代器。这个方法使得你可以遍历集合中的元素。通常,iter()适用于以下几种类型:1.数组(Array)数组是固定大小的集合,iter()可以用来遍历数组中的元素。示例:letarr=[1,2,3];foriteminarr.iter(){......
  • 掌握设计模式--责任链模式
    责任链模式(ChainofResponsibility)责任链模式(ChainofResponsibility)是一种行为型设计模式,旨在通过将请求沿着一系列处理者传递,形成一条处理链,直到请求被处理链上特定的结点处理为止。它允许多个对象有机会处理请求,而不需要明确指定哪个对象将处理该请求。每个处理者包含对......
  • WRF模式理论讲解,从动力方程、参数化方案及python语言与WRF模式运行结合
    当今从事气象及其周边相关领域的人员,常会涉及气象数值模式及其数据处理,无论是作为业务预报的手段、还是作为科研工具,掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者,模式功能齐全,是大部分人的第一选择。而掌握模式还只是第一步,将......
  • 访问者模式详解
    访问者模式(VisitorPattern)是一种行为型设计模式,它允许在不修改现有类结构的情况下,向现有类添加新的操作。该模式通过定义一个访问者接口,将算法与对象结构分离,使得操作可以独立于数据结构而变化。访问者模式的结构访问者模式主要包含以下组件:1. 抽象访问者(Visitor):• 声......
  • 空对象模式详解
    空对象模式详解定义空对象模式(NullObjectPattern)是一种行为设计模式,通过引入一个特殊的空对象来代替对空值的直接使用。这个空对象实现了与真实对象相同的接口,但其方法体通常为空或者提供默认的行为,从而避免了在代码中频繁进行空指针(NULL)检查。结构组成1. 抽象对象(Abst......
  • 32ADC单通道连续模式只能采样一次问题,adc值不更新( CUBMX+HAL)
    1.问题使用ADC2,单通道(IN15)连续模式cubemx配置如下在main.c中添加如下函数结果adc_value的值只有复位时有效,然后值一直不变(IN15的IO口接了个电压值不断变换的信号)2.解决只要在cubemx中使能LowPowerAutoWait,代码不变,即可正常工作......
  • 【好书推荐:一本书读懂AI Agent】4种革新性AI Agent工作流设计模式全解析
    目录4种革新性AIAgent工作流设计模式全解析1.反思2.工具使用3.规划4.多Agent协作总结4种革新性AIAgent工作流设计模式全解析**导读:**AIAgent是指能够在特定环境中自主执行任务的人工智能系统,不仅接收任务,还自主制定和执行工作计划,并在过程中不断自我评估和......
  • 设计模式-工厂模式-宏注册
    组织代码的方式如果项目非常小且简单,或者明确知道将来不会需要额外的维护和功能扩展,那么面向过程可能是一个更快且成本更低的方案。项目需求和特定场景。有些项目可能更适合面向过程的开发模式,比如一些计算密集型的科学计算软件,在大型项目开发中,面向对象的方法支持更好......