十七、迭代器模式

  • 目的 : 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  • 核心 : 定义迭代器接口(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
相关推荐
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜2 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫2 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq2 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮2 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js