十七、迭代器模式

  • 目的 : 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  • 核心 : 定义迭代器接口(hasNext(), next())。聚合对象(如集合)提供创建相应迭代器的方法。迭代器封装了遍历集合的细节。
  • 场景 :适用于遍历复杂数据结构,如多维数组、树或图,简化代码,提高可读性。

首先是迭代器接口,定义了迭代器的基本操作,支持双向遍历。

java 复制代码
package iterator;

public interface IIterator<T> {	

    boolean hasNext();      // 是否有下一个元素
    boolean hasPrevious();  // 是否有前一个元素

    T next();               // 获取下一个元素
    T previous();           // 获取前一个元素
}

具体迭代器实现接口

java 复制代码
package iterator;

public class MyIterator<T> implements IIterator<T> {

	private ICollection<T> collection;			// 持有对集合的引用
	private int index = 0;						// 当前迭代位置

	public MyIterator(ICollection<T> collection) {
		this.collection = collection;
	}

	@Override
	public boolean hasNext() {					// 检查是否有下一个
		return index < this.collection.size();
	}

	@Override
	public boolean hasPrevious() {				// 检查是否有上一个
		return index > 0;
	}

	@Override
	public T next() {							// 获取下一个
		return this.collection.get(index++);
	}

	@Override
	public T previous() {						// 获取上一个
		return this.collection.get(index--);
	}
}

接口 定义了集合的基本操作 和 获取迭代器的方法

java 复制代码
package iterator;

public interface ICollection<T> {	

    IIterator<T> iterator();  // 创建迭代器

    void add(T t);           // 添加元素

    T get(int index);        // 获取元素

    int size();              // 获取大小
}
java 复制代码
package iterator;

import java.util.Arrays;

public class MyCollection<T> implements ICollection<T> {

	private T[] arys;						 // 内部数组存储元素
	private int index = -1;					// 当前索引  跟踪当前元素数量
	private int capacity = 6;			   // 初始容量  数组满时自动扩容(每次增加6)

	@SuppressWarnings("unchecked") // 抑制 编译器关于 强制类型转换 的警告
	public MyCollection() {
		this.arys = (T[])new Object[capacity];	// 先创建 Object[] 再强制转型为 T[]
	}										   // 创建一个泛型数组 arys,初始大小为 capacity(默认为6)

	@Override
	public IIterator<T> iterator() {	// 创建一个迭代器
		return new MyIterator<>(this);  /*    返回一个新的 MyIterator 实例	  */
	}									// 将当前集合对象(this)传递给迭代器,使迭代器能访问集合的元素

	@Override
	public void add(T t) {
		index++;										    // 跟踪当前元素数量
		if(index == capacity){								// 数组满时
			capacity += 6;									// 自动扩容(每次增加6)
			this.arys = Arrays.copyOf(arys, capacity);
		}
		this.arys[index] = t;
	}

	@Override
	public T get(int index) {
		if(index < size()){					// 检查索引是否有效
			return this.arys[index];
		}
		return null;						// 无效索引返回null
	}

	@Override
	public int size() {						// 返回集合中当前元素的数量
		return index + 1;
	}
}

函数入口

java 复制代码
package iterator;

public class MainTest {
	public static void main(String[] args) {
		ICollection<Object> collection = new MyCollection<>();
		add(collection, "a", "b", "c", "d", 3, 5, 6, 7);
		for(IIterator<Object> iterator = collection.iterator(); iterator.hasNext();){
			System.out.println(iterator.next());
		}
	}

	@SuppressWarnings("unchecked")
	static<T> void add(ICollection<T> c,T ...a){
		for(T t : a){
			c.add(t);
		}
	}

最终会依次输出:

复制代码
a
b
c
d
3
5
6
7
相关推荐
笨蛋不要掉眼泪9 分钟前
RabbitMQ消息队列:SpringAMQP
java·分布式·rabbitmq
Mark_ZP28 分钟前
【锁6】AQS (AbstractQueuedSynchronizer) 核心原理详解
java
AI砖家31 分钟前
多商户多租户系统架构设计文档(Java版)
java·开发语言·系统架构·多租户·多商户
落苜蓿蓝1 小时前
Java 循环中对象复用导致属性覆盖?从 JVM 内存模型讲解原因
java·jvm·python
weixin_440784111 小时前
Android基础知识汇总
android·java·android studio
布鲁飞丝1 小时前
从零实现富文本编辑器#-浏览器选区与编辑器选区模型同步
java·前端·编辑器
jun_bai2 小时前
使用java安全的移动文件
java
caishenzhibiao2 小时前
市场同步系统 同花顺期货通指标
java·c语言·c#
Devin~Y2 小时前
从本地生活电商到 AI RAG:互联网大厂 Java 面试场景完整实战
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag
520拼好饭被践踏2 小时前
JAVA+Agent学习day25
java·开发语言·学习