迭代器模式(Iterator Pattern)又叫作游标模式(Cursor Pattern),它提供一种按顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示
迭代器模式屏蔽了内部元素的获取细节,为外部提供一致的元素访问行为,解耦了元素迭代与集合对象间的耦合,并且通过提供不同的迭代器,可以为同一个集合对象提供不同顺序的元素访问行为
jdk的Collection、Set已经实现了迭代器,不需要自己实现
场景
(1)访问一个集合对象的内容而无须暴露它的内部表示。
(2)为遍历不同的集合结构提供一个统一的访问接口。
public interface Iterator<E> {E next();boolean hasNext();}public class ConcreteIterator<E> implements Iterator<E> {private List<E> list;private int cursor = 0;public ConcreteIterator(List<E> list) {this.list = list;}@Overridepublic E next() {if(this.hasNext()){return this.list.get(cursor++);}else {return null;}}@Overridepublic boolean hasNext() {return this.cursor < list.size();}}public interface Aggregate<E> {boolean add(E element);boolean remove(E element);Iterator iterator();}public class ConcreteAggregate<E> implements Aggregate<E> {private List<E> list = new ArrayList<>();@Overridepublic boolean add(E element) {return this.list.add(element);}@Overridepublic boolean remove(E element) {return this.list.remove(element);}@Overridepublic Iterator iterator() {return new ConcreteIterator(this.list);}}
框架
jdk的Iterator
package java.util;import java.util.function.Consumer;public interface Iterator<E> {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}}
Mybatis的CursorIterator
优点
- 多态
- 解耦了元素迭代与集合对象间的耦合
- 提供不同顺序的元素访问行为
