迭代器模式提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节

场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示
  • 需要为聚合对象提供多种遍历方式
  • 为遍历不同的聚合结构提供一个统一的接口

实现

  • Iterator 迭代器接口:负责定义、访问和遍历元素的接
  • IteratorImpl 具体迭代器类: 实现迭代器接口
  • Container 容器接口:定义容器的基本功能以及提供创建迭代器的接口
  • ContainerImpl 具体容器类:实现容器接口中的功能
  • Client 客户端类:即要使用迭代器模式的地方

Iterator 迭代器接口

  1. public interface Iterator {
  2. public boolean hasNext();
  3. public Object next();
  4. }

Container 容器接口

  1. public interface Container {
  2. public Iterator getIterator();
  3. }

NameRepository 具体容器实现,以及内部具体迭代器 NameIterator 实现

  1. public class NameRepository implements Container {
  2. public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
  3. @Override
  4. public Iterator getIterator() {
  5. return new NameIterator();
  6. }
  7. private class NameIterator implements Iterator {
  8. int index;
  9. @Override
  10. public boolean hasNext() {
  11. if(index < names.length){
  12. return true;
  13. }
  14. return false;
  15. }
  16. @Override
  17. public Object next() {
  18. if(this.hasNext()){
  19. return names[index++];
  20. }
  21. return null;
  22. }
  23. }
  24. }

IteratorPatternDemo 客户端类

  1. public class IteratorPatternDemo {
  2. public static void main(String[] args) {
  3. NameRepository namesRepository = new NameRepository();
  4. for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
  5. String name = (String)iter.next();
  6. System.out.println("Name : " + name);
  7. }
  8. }
  9. }

优点

  • 可以支持以不同的方式去遍历容器对象,如顺序遍历,逆序遍历等等
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码
  • 符合单一职责原则,容器类与遍历算法的分离,不同类负责不同的功能

缺点

  • 会产生多余的对象,会增多类文件
  • 遍历过程是一个单向且不可逆的遍历
  • 遍历过程需要注意容器是否改变,若期间改变了,可能会抛出异常

Android 中的应用

Map、List、Cursor等

参考

书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式