十七、迭代器模式

  • 目的 : 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  • 核心 : 定义迭代器接口(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
相关推荐
qq_5895681019 小时前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot
JAVA面经实录91719 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦20 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
FYKJ_201020 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
书源丶21 小时前
三十六、File 类与 IO 流基础——文件操作的「第一步」
java
AI人工智能+电脑小能手1 天前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
DFT计算杂谈1 天前
wannier90 参数详解大全
java·前端·css·html·css3
marsh02061 天前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
张健11564096481 天前
临界区和同一线程上锁
java·开发语言·jvm