提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

    【角色】

    • 迭代器接口(Iterator): 负责定义、访问和遍历元素的接口。
    • 具体迭代器类(ConcreteIterator): 目的主要是实现迭代器接口,并记录遍历的当前位置。
    • 容器接口(Aggregate): 负责提供创建具体迭代器角色的接口。
    • 具体容器类(ConcreteAggregate): 具体迭代器角色与该容器相关联。

      1. /**
      2. * 迭代器接口
      3. */
      4. public interface Iterator<E> {
      5. /**
      6. * 是否还有下一个元素
      7. * @return
      8. */
      9. boolean hasNext();
      10. /**
      11. * 返回当前位置的元素并将位置移动到下一位
      12. * @return
      13. */
      14. E next();
      15. }
      1. /**
      2. * 具体迭代器类
      3. */
      4. public class ConcreteIterator<E> implements Iterator<E> {
      5. /**
      6. * 记录迭代位置
      7. */
      8. private int cursor = 0;
      9. private List<E> list;
      10. public ConcreteIterator(List<E> list) {
      11. this.list = list;
      12. }
      13. @Override
      14. public boolean hasNext() {
      15. return cursor != list.size();
      16. }
      17. @Override
      18. public E next() {
      19. E obj = null;
      20. if (hasNext()) {
      21. obj = list.get(cursor++);
      22. }
      23. return obj;
      24. }
      25. }
      1. /**
      2. * 容器接口
      3. */
      4. public interface Aggregate<E> {
      5. /**
      6. * 添加
      7. * @param e
      8. */
      9. void add(E e);
      10. /**
      11. * 删除
      12. * @param e
      13. */
      14. void remove(E e);
      15. /**
      16. * 获取迭代器
      17. * @return
      18. */
      19. Iterator<E> iterator();
      20. }
      1. /**
      2. * 具体容器类
      3. */
      4. public class ConcreteAggregate<E> implements Aggregate<E> {
      5. /**
      6. * 模拟具体容器
      7. */
      8. private List<E> list = new ArrayList<>();
      9. @Override
      10. public void add(E e) {
      11. list.add(e);
      12. }
      13. @Override
      14. public void remove(E e) {
      15. list.remove(e);
      16. }
      17. @Override
      18. public Iterator iterator() {
      19. return new ConcreteIterator(list);
      20. }
      21. }
      1. public class IteratorTest {
      2. public static void main(String[] args) {
      3. // 创建容器
      4. Aggregate aggregate = new ConcreteAggregate();
      5. aggregate.add(1);
      6. aggregate.add(2);
      7. aggregate.add(3);
      8. aggregate.add(4);
      9. // 获取迭代器
      10. Iterator iterator = aggregate.iterator();
      11. while (iterator.hasNext()) {
      12. System.out.println("迭代:" + iterator.next());
      13. }
      14. }
      15. }
      16. ----输出----
      17. 迭代:1
      18. 迭代:2
      19. 迭代:3
      20. 迭代:4