Java设计模式之迭代器模式(Iterator)

本文深入解析迭代器模式,探讨其在Java集合中的应用,通过实例展示如何遍历部门员工信息,强调模式在实际开发中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

一看到Iterator,相信大家都很熟悉,没错,Iterator就是你们熟悉的它,主要功能就是迭代对象进行遍历,由于它太太太普遍了,所以Java已经将它融为到语言中了。在jdk中也提供了java.util.Iterator接口,并应用于各个集合当中,我们可以用集合中的iterator()方法进行遍历,不需要我们再额外自己去写迭代器的方法了,所以迭代器模式也显得不那么重要了。但其实它算是使用频率最高的模式之一了,只是不需要我们自己去设计了,而是已经被设计在我们常常使用的集合之中了。

但作为23种常用的设计模式之一,这里我还是对迭代器模式做一个简单的学习和总结。

二、迭代器模式

1. 定义

迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。(引自《大话设计模式》)

2. 基本结构

 Aggregate:聚集抽象类。

ConcreteAggregate:具体聚集类,实现了创建迭代器对象的方法。

MyIterator:迭代器抽象类,主要提供了4个统一接口——得到开始对象、得到下一对象、是否是最后一个、得到当前对象,这里的方法根据需求可以随意增减。

ConcreteIterator:具体迭代器类。

3. 一些说明

jdk中已经提供了Iterator接口,包含了如下方法:

所以,如果这些方法已经可以满足当前需求时,可直接让ConcreteIterator继承Iterator即可,或者让MyIterator继承Iterator,然后在MyIterator中进行一些新方法的补充。

类图已经很清晰了,下面我从一个实际例子出发进一步说明此模式。

三、实战应用

举个例子说明,很简单的例子,现在要遍历某部门的员工信息。

用类图分析一下吧

我这里面的IMyIterator就继承了Iterator,而且我没有写新的方法,因为Iterator中的hasNext()和next()方法已经可以满足我目前的需求,从现在这个需求来说,可以省略IMyIterator,让ConcreteIterator直接继承Iterator也可以。

看一下代码实现~

IPerson

/**
 * 聚集抽象类
 */
public interface IPerson {
	public void add(String name,int age,String sex);//新增员工:姓名,年龄,性别
	public String gerInfo();//获取员工信息
	public IMyIterator iterator();//遍历员工
}

 IMyIterator

/**
 * 迭代抽象类
 */
public interface IMyIterator extends Iterator<IPerson>{
	
}

ConcretePerson,这里包含了name,age,sex三个员工属性,也可以用实体类来表示,这里为了简便只是罗列了出来。

public class ConcretePerson implements IPerson {
	private List<IPerson> personList = new ArrayList<IPerson>();//声明员工集合
	private String name;
	private int age;
	private String sex;
	
	public ConcretePerson() {
		super();
	}
	
	public ConcretePerson(String name,int age,String sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	@Override
	public void add(String name,int age,String sex) {
		this.personList.add(new ConcretePerson(name,age,sex));
	}

	@Override
	public String gerInfo() {
		return "员工姓名:"+this.name+",员工年龄:"+String.valueOf(this.age)+",员工性别:"+this.sex;
	}

	@Override
	public IMyIterator iterator() {
		return new ConcreteMyIterator(this.personList);
	}

}

ConcreteMyIterator

public class ConcreteMyIterator implements IMyIterator {
	private List<IPerson> personList = new ArrayList<IPerson>();//声明员工集合
	private int current = 0;
	
	public ConcreteMyIterator(List<IPerson> personList) {
		this.personList = personList;
	}
	
	@Override
	public boolean hasNext() {
		return current >= personList.size() ? false : true;
	}

	@Override
	public IPerson next() {
		IPerson p = personList.get(current);
		current++;
		return p;
	}

}

测试类

public class IteratorTest {

	public static void main(String[] args) {
		//声明聚集对象
		IPerson person = new ConcretePerson();
		
		//来新员工了~~~
		person.add("张三", 20, "男");
		person.add("李四", 19, "男");
		person.add("韩梅梅", 18, "女");
		
		//遍历
		IMyIterator i = person.iterator();
		while(i.hasNext()) {
			IPerson p = i.next();
			System.out.println(p.gerInfo());
		}
	}

}

结果

从类图和具体代码实现来看,整个结构还是比较清晰的,但其实从实际来说,如果只是简单的遍历,我们无需如此周张的用几个类来实现遍历,只要简单的遍历list即可。其实list的底层实现也是迭代,就相当于在使用迭代器模式了,这里只是简单举个例子进行说明该模式,在实际应用中,还是要从需求出发,采用更便捷的方式才好。

 

写在最后,

本文主要是小猫看了《大话设计模式》的一些记录笔记,再加之自己的一些理解整理出此文,方便以后查阅,仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值