概述
迭代器模式 :
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问容器(如集合、列表)中元素的方式,而无需暴露容器的内部表示。
角色介绍
- 迭代器接口(Iterator):定义用于遍历容器元素的方法,如获取下一个元素、判断是否还有下一个元素等。
- 具体迭代器(ConcreteIterator):实现迭代器接口,负责实际的遍历过程,并记录当前所在位置等状态。
- 容器接口(Container):定义容器类的共同接口,包括获取迭代器的方法。
- 具体容器(ConcreteContainer):实现容器接口,负责创建具体迭代器对象。
优点与缺点
优点
1- 迭代器模式提供了一种统一的方式来访问容器中的元素,将遍历和具体容器实现解耦,使代码更加灵活和可维护
缺点
增加了代码复杂性:引入迭代器模式会增加额外的代码和类,这可能会增加代码的复杂性和理解难度,尤其是在处理复杂的数据结构时。
需要额外的内存空间:在使用迭代器模式时,需要为每个容器对象创建一个迭代器对象。这就意味着需要额外的内存空间来存储这些迭代器对象。
不适合修改操作:迭代器模式强调遍历和访问容器元素,而不是对容器进行修改操作。如果需要对容器进行频繁的修改操作,可能需要使用其他设计模式或重新考虑设计方案。
迭代器的一致性限制:由于迭代器模式要求所有的容器都实现相同的迭代器接口,这就意味着容器的实现会受到一些限制。如果容器的内部结构需要频繁变化,可能会导致迭代器的一致性难以保证。
UML类图展示
1-自定义迭代器接口
public interface IteratorMy {
//获取下个元素
public String next();
//是否还有元素
public boolean hasNext();
}
2- 迭代器接口的实现类
public class IteratorMyImpl implements IteratorMy {
private List<String> list;
/**
* 当前处理的集合索引
*/
private int position;
/**
*当前遍历的对象
*/
private String en;
/**
* <简述>构造器维护集合
*/
public IteratorMyImpl(List<String> list){
this.list = list;
}
@Override
public boolean hasNext() {
return position < list.size() ? false : true;
}
@Override
public String next() {
System.out.println("返回 " + position + " 位置的对象 : " + en);
en = list.get(position);
position++;
return en;
}
}
3- 容器接口
定义对于集合的增加 和删除操作,以及获取迭代器的操作。
这边就用基础类型String来操作演示,不用实体类了
public interface EntityManager {
/**
* 增加
*/
void addEntity(String entity);
/**
* 删除
*/
void removeEntity(String entity);
/**
* 获取集合的迭代器
* @return
*/
IteratorMyImpl getEntityIterator();
}
4-定义容器接口的实现类
public class EntityManagerImpl implements EntityManager {
private ArrayList<String> list;
//构造方法注入集合
public EntityManagerImpl(){
this.list = new ArrayList<>();
}
@Override
public void addEntity(String entity) {
this.list.add(entity);
}
@Override
public void removeEntity(String entity) {
this.list.remove(entity);
}
@Override
public IteratorMyImpl getEntityIterator() {
return new IteratorMyImpl(this.list);
}
}
5-测试
@org.junit.jupiter.api.Test
void contextLoads1() {
EntityManager manager = new EntityManagerImpl();
manager.addEntity("jack");
manager.addEntity("rose");
manager.addEntity("anni");
IteratorMyImpl iterator = manager.getEntityIterator();
while (!iterator.hasNext()){
iterator.next();
}
}
结果展示:
返回 0 位置的对象 : jack
返回 1 位置的对象 : rose
返回 2 位置的对象 : anni
总结:
由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。