迭代器模式是一种高效的数据访问方式,它提供了一种顺序访问集合对象中的各个元素,而又不暴露该对象的内部表示的方法。在迭代器模式中,我们使用一个迭代器类来实现对集合对象的遍历操作。这个迭代器类需要实现两个方法:hasNext() 和 next()。hasNext() 方法用于判断是否还有下一个元素,next() 方法用于获取下一个元素的值。通过这种方式,我们可以方便地访问集合对象中的各个元素,而不需要关心集合对象的具体实现细节。
在计算机科学中,设计模式是一种被广泛接受的可重用的解决方案,它可以帮助我们解决常见的编程问题,迭代器模式是这其中的一种,它提供了一种方法来顺序访问一个聚合对象(如列表、数组等)中的各个元素,而又不暴露该对象的内部表示,这种模式的主要优点是可以在不破坏封装性的前提下,实现对数据的遍历操作。
迭代器模式的主要角色有三个:抽象迭代器(Iterator)、具体迭代器(ConcreteIterator)和容器(Container)。
1、抽象迭代器(Iterator):定义了一组公共的方法,包括next()
、hasNext()
和remove()
,这些方法应该由具体的迭代器类来实现。
public interface Iterator { Object next(); boolean hasNext(); void remove(); }
2、具体迭代器(ConcreteIterator):实现了抽象迭代器接口,提供了具体的next()
、hasNext()
和remove()
方法的实现,我们可以为一个列表创建一个具体的迭代器。
public class ConcreteIterator implements Iterator { private List<String> list; private int index = 0; public ConcreteIterator(List<String> list) { this.list = list; } @Override public Object next() { if (hasNext()) { return list.get(index++); } else { throw new NoSuchElementException(); } } @Override public boolean hasNext() { return index < list.size(); } @Override public void remove() { throw new UnsupportedOperationException(); } }
3、容器(Container):维护一个内部的数据结构来存储元素,并提供iterator()
方法来返回一个具体的迭代器,容器类需要实现Iterable
接口。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Container implements Iterable<String> { private List<String> list = new ArrayList<>(); public void add(String item) { list.add(item); } @Override public Iterator<String> iterator() { return new ConcreteIterator(list); } }
通过这种方式,我们可以在不破坏封装性的前提下,实现对数据的遍历操作,由于具体的迭代器类是由外部提供的,我们可以对其进行单元测试,确保其正确性,如果需要改变数据结构或访问方式,只需更换具体的迭代器类即可,无需修改容器类的代码。