迭代器模式(Iterator Pattern)又叫作游标模式(Cursor Pattern),它提供一种按顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示

    迭代器模式屏蔽了内部元素的获取细节,为外部提供一致的元素访问行为,解耦了元素迭代与集合对象间的耦合,并且通过提供不同的迭代器,可以为同一个集合对象提供不同顺序的元素访问行为
    image.png
    jdk的Collection、Set已经实现了迭代器,不需要自己实现

    场景
    (1)访问一个集合对象的内容而无须暴露它的内部表示。
    (2)为遍历不同的集合结构提供一个统一的访问接口。

    1. public interface Iterator<E> {
    2. E next();
    3. boolean hasNext();
    4. }
    5. public class ConcreteIterator<E> implements Iterator<E> {
    6. private List<E> list;
    7. private int cursor = 0;
    8. public ConcreteIterator(List<E> list) {
    9. this.list = list;
    10. }
    11. @Override
    12. public E next() {
    13. if(this.hasNext()){
    14. return this.list.get(cursor++);
    15. }else {
    16. return null;
    17. }
    18. }
    19. @Override
    20. public boolean hasNext() {
    21. return this.cursor < list.size();
    22. }
    23. }
    24. public interface Aggregate<E> {
    25. boolean add(E element);
    26. boolean remove(E element);
    27. Iterator iterator();
    28. }
    29. public class ConcreteAggregate<E> implements Aggregate<E> {
    30. private List<E> list = new ArrayList<>();
    31. @Override
    32. public boolean add(E element) {
    33. return this.list.add(element);
    34. }
    35. @Override
    36. public boolean remove(E element) {
    37. return this.list.remove(element);
    38. }
    39. @Override
    40. public Iterator iterator() {
    41. return new ConcreteIterator(this.list);
    42. }
    43. }

    框架
    jdk的Iterator

    1. package java.util;
    2. import java.util.function.Consumer;
    3. public interface Iterator<E> {
    4. boolean hasNext();
    5. E next();
    6. default void remove() {
    7. throw new UnsupportedOperationException("remove");
    8. }
    9. default void forEachRemaining(Consumer<? super E> action) {
    10. Objects.requireNonNull(action);
    11. while (hasNext())
    12. action.accept(next());
    13. }
    14. }

    Mybatis的CursorIterator

    优点

    • 多态
    • 解耦了元素迭代与集合对象间的耦合
    • 提供不同顺序的元素访问行为