十七、迭代器模式

  • 目的 : 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  • 核心 : 定义迭代器接口(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
相关推荐
殘殤血5 分钟前
Tomcat的事件监听机制:观察者模式 _
java·观察者模式·tomcat
汤姆yu6 分钟前
面向具身智能的物理视频模拟器:蚂蚁灵波LingBot-Video开源模型全解析
java·大数据·人工智能·gpt·开源·大模型·音视频
SQL-First布道者11 分钟前
Spring JDBC Ultra 十边型战士
java·spring boot·后端·mysql·spring·mybatis
殘殤血16 分钟前
Tomcat的事件监听机制:观察者模式
java·观察者模式·tomcat
Java面试题总结33 分钟前
GatewayWorker 从零到一完整指南
java
没钥匙的锁136 分钟前
04-Java面向对象基础
java·开发语言·mongodb
脉动数据行情44 分钟前
Java OkHttp 完整封装 GC COMEX 美黄金实时盘口定时拉取工具类
java·okhttp·comex 黄金·外盘贵金属
敖行客 Allthinker1 小时前
IM 融合专题:后端架构师的核心修炼
java·开发语言·数据库
HAPPY酷1 小时前
【ROS2】16G 内存笔记本跑 ROS2 仿真?VMware 虚拟机“保姆级”配置指南 (R9 7940HX + RTX 4060)
java·linux·ide·windows·pycharm
折哥的程序人生 · 物流技术专研9 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列