概念

  • 提供一个对象(迭代器)来顺序访问聚合对象(迭代数据)中的一系列数据,而不暴露聚合对象的内部表示。对象行为型模式
  • image.png

主要角色

  • 抽象聚合(Aggregate)角色:
    • 定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  • 具体聚合(ConcreteAggregate)角色:
    • 实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器(Iterator)角色:
    • 定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
  • 具体迭代器(Concretelterator)角色:

    • 实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置 ```java /**

      • 抽象聚合(Aggregate)角色 */ public abstract class BeautifulMan {

      //不方便暴露给外界的集合。只允许外界获取而不可以操作 private List girlFriends = new ArrayList<>();

      void likeYou(String name){ girlFriends.add(name); }; void sayBye(String name){ girlFriends.remove(name); };

      /**

      • 获取迭代器
      • @return */ public Itr getIterator(){ return new Iterator(); }

      /**

      • 具体迭代器 */ class Iterator implements Itr{

        private int cursor = 0; //当前指针

  1. public boolean hasNext(){
  2. return cursor < girlFriends.size();
  3. }
  4. public String next(){
  5. //第一次调用返回第一个数据
  6. //下一次再调用自动访问下一个数据
  7. String s = girlFriends.get(cursor);
  8. cursor++;
  9. return s;
  10. }
  11. @Override
  12. public String firstLove() {
  13. return girlFriends.get(0);
  14. }
  15. @Override
  16. public String current() {
  17. return girlFriends.get(girlFriends.size()-1);
  18. }
  19. }
  20. /**
  21. * 抽象迭代器,写在外部该怎么写?
  22. */
  23. interface Itr {
  24. //有没有下一个
  25. boolean hasNext();
  26. //返回下一个
  27. String next();
  28. //返回初恋(第一个)
  29. String firstLove();
  30. //返回现任(最后一个女朋友)
  31. String current();
  32. }

}

```java
public class MaYuCheng extends BeautifulMan{

}
public class MainTest {

    public static void main(String[] args) {

        MaYuCheng cheng = new MaYuCheng();

        cheng.likeYou("王刚");
        cheng.likeYou("李强");
        cheng.likeYou("赵根");


        BeautifulMan.Itr itr = cheng.getIterator();
        String s = itr.firstLove();
        System.out.println(s);

        String current = itr.current();
        System.out.println(current);

        System.out.println("=================");
        while (itr.hasNext()){
            String next = itr.next();
            System.out.println(next);
        }


    }
}

应用场景

  • jdk容器接口的Iterator定义
  • 现实开发中,我们几乎无需编写迭代器,基本数据结构链表、树、图的迭代器已经都有了。除非要重写迭代逻辑