「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战」。
一、什么是迭代器模式
迭代器模式:提供一个对象来顺序访问聚合对象内部的数据,而不暴露聚合对象内部。常见的运用有集合访问中的迭代器,就是实现了迭代器模式。
二、迭代器模式的实现
public interface Iterator {
String next();
boolean hasNext();
}
抽象的迭代器角色。
public class MyIterator implements Iterator {
private List<String> list;
private Integer index;
public MyIterator(List<String> list) {
this.list = list;
this.index = -1;
}
@Override
public String next() {
if (hasNext()){
return list.get(++index);
}
return null;
}
@Override
public boolean hasNext() {
return index < list.size() - 1;
}
}
具体迭代器角色,实现了抽象迭代器定义的hasNext方法和next方法。
public interface AbstractStringCollect {
void add(String s);
void remove(String s);
Iterator getIterator();
}
抽象聚合角色,有增加元素和删除元素的方法,以及获取迭代器方法。
public class StringCollect implements AbstractStringCollect {
private List<String> list = new ArrayList<>();
@Override
public void add(String s) {
list.add(s);
}
@Override
public void remove(String s) {
list.remove(s);
}
@Override
public Iterator getIterator() {
return new MyIterator(list);
}
}
具体聚合元素,实现了抽象聚合角色的方法。
public class IteratorTest {
public static void main(String[] args) {
StringCollect collect = new StringCollect();
collect.add("张三");
collect.add("李四");
collect.add("王五");
Iterator iterator = collect.getIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
顺序遍历添加到聚合里面的元素。
三、总结
如果我们把遍历集合的方法封装在类内部,到了我们需要修改遍历方法的时候,我们就需要修改原来的代码,违背了开闭原则,所以我们提供了迭代器来实现元素的访问。迭代器模式的缺点是增加迭代器会增加几个类,一定程度上增加了系统的复杂性。
迭代器模式的角色:
- 抽象聚合角色:定义存储,添加,删除聚合对象以及获取迭代器对象的接口。
- 具体聚合角色:实现抽象聚合,返回一个具体的迭代器。
- 抽象迭代器:定义访问和遍历聚集元素的接口,通常包括hasNext和next。
- 具体迭代器:抽象迭代器的实现。