什么是迭代器模式
迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示,即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。
迭代器模式的实现
迭代器模式角色
- 抽象迭代器角色(Iterator):定义遍历元素所需要的方法,通常包含next()、hasNext()、remove()等。
- 具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
- 容器角色(Aggregate):一般是接口,定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
- 具体容器角色(ConcreteAggregate):抽象容器的具体实现类,实现抽象容器,创建出容器迭代器的对象。
迭代器模式类图
迭代器模式代码实现
抽象迭代器角色
package com.common.demo.pattern.iterator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 抽象迭代器角色 抽象迭代器
* @date 2023/08/03 22:38:43
*/
public interface Iterator {
//判断是否还有下一个元素
boolean hasNext();
//获取第一个元素
Object first();
//获取下一个元素
Object next();
}
具体迭代器角色
package com.common.demo.pattern.iterator;
import java.util.List;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体迭代器角色 对象迭代器
* @date 2023/08/03 22:39:30
*/
public class ObjectIterator implements Iterator{
private List<Object> list;
//记录遍历时的位置
private int position = 0;
public ObjectIterator(List<Object> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return position<list.size();
}
@Override
public Object first() {
return list.get(0);
}
@Override
public Object next() {
return list.get(position++);
}
}
抽象容器角色
package com.common.demo.pattern.iterator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 抽象聚合/容器角色
* @date 2023/08/03 22:43:07
*/
public interface Aggregate {
//添加对象
void addObject(Object object);
//移除对象
void removeObject(Object object);
//获取迭代器
Iterator getIterator();
}
具体容器角色
package com.common.demo.pattern.iterator;
import java.util.ArrayList;
import java.util.List;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体聚合/容器角色 对象聚合
* @date 2023/08/03 22:43:31
*/
public class ObjectAggregate implements Aggregate{
private List<Object> list = new ArrayList<>();
@Override
public void addObject(Object object) {
list.add(object);
}
@Override
public void removeObject(Object object) {
list.remove(object);
}
@Override
public Iterator getIterator() {
return new ObjectIterator(list);
}
}
测试类
package com.common.demo.pattern.iterator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 测试类
* @date 2023/08/03 22:44:47
*/
public class Test {
public static void main(String[] args) {
//创建聚合对象
ObjectAggregate objectAggregate = new ObjectAggregate();
//在聚合对象中填充数据
objectAggregate.addObject("我是好人一号");
objectAggregate.addObject("我是好人二号");
objectAggregate.addObject("我是好人三号");
//获取迭代器
Iterator iterator = objectAggregate.getIterator();
//通过迭代器迭代数据
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
测试截图
迭代器模式的特点
优点
- 简化集合遍历代码:迭代器模式可以封装集合对象的遍历过程,使得客户端代码更简洁清晰,无需关心集合对象的内部表示和遍历方式。
- 支持多种遍历方式:通过定义不同的迭代器类,可以实现对同一个聚合对象的不同遍历方式,灵活地应对不同的需求。
- 封装聚合对象的内部表示:迭代器将遍历操作从聚合对象中抽离出来,使得聚合对象可以更好地封装自己的内部数据结构。
缺点
- 增加了系统复杂性:引入迭代器模式将会增加额外的类和接口,增加了系统的复杂性和理解难度。
- 需要额外的内存开销:每个迭代器对象都需要占用一定的内存空间,当迭代器数量较多时,会增加系统的内存开销。
使用场景
- 需要遍历聚合对象的情况:当需要遍历访问一个聚合对象的元素,并且对外部隐藏其内部表示时,可以考虑使用迭代器模式。
- 需要支持多种遍历方式的情况:当同一聚合对象需要支持多种不同的遍历方式时,可以使用迭代器模式来实现。
注意事项
- 迭代器模式一般包括迭代器接口和具体迭代器实现类,以及聚合对象和具体聚合对象类。在使用迭代器模式时,需要注意它们之间的关系和协作。
- 聚合对象需要提供创建迭代器对象的接口,以便客户端能够获取迭代器对象进行遍历操作。
- 注意迭代器对象的生命周期管理,特别是在多线程环境下,需要注意迭代器的线程安全性和一致性。
- 考虑迭代器模式的性能影响,尤其是对于大规模数据集合的遍历操作,需要合理评估迭代器模式的适用性和性能开销。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)