本文最后更新于 2025年7月27日 下午
提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。
角色
- 抽象迭代器 : 定义了访问和遍历元素的接口,然后在其子类中实现这些方法
- 具体迭代器 :实现抽象迭代接口,完成对集合对象的遍历,同时对遍历时的位置进行跟踪
- 抽象聚合类 : 用于存储对象,创建相应的迭代器对象的接口。它带有一个iterator()方法,用于创建迭代器对象
- 具体聚合类 :用于实现创建相应的迭代器对象的接口,以及iterator方法,并且返回于该具体聚合相对应的具体迭代器实例
场景
需要访问一个集合对象的内容,而又不想暴露它的内部表示。
需要对集合对象进行多种方式的遍历。
需要对多个不同结构的集合使用统一的遍历接口。
实现迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public interface MyIterator { boolean hasNext(); Object next(); }
public interface MyContainer { void add(Object obj); void remove(Object obj); MyIterator iterator(); }
public class ListContainer implements MyContainer { private List<Object> list = new ArrayList<>(); @Override public void add(Object obj){ list.add(obj); }
@Override public void remove(Object obj){ list.remove(obj); }
@Override public MyIterator iterator(){ return new MyIteratorImpl(); }
private class MyIteratorImpl implements MyIterator { private int index = 0 ; @Override public boolean hasNext(){ return index >= list.size()? false : true ; } @Override public Object next(){ Object obj = list.get(index); index++; return obj ; } } }
public class Test{ public static void main(String[] args){ ListContainer listContainer = new ListContainer(); listContainer.add("张三"); listContainer.add("李四");
MyIterator iterator = listContainer.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }
|
总结
提供一种顺序访问聚合对象中各个元素的方法,而不暴露其内部结构。其核心思想是将集合的遍历行为抽象为一个独立的对象,使遍历过程与集合对象解耦,从而支持多个遍历器共存、统一接口访问不同类型的集合结构。