博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Iterator 迭代器模式 MD
阅读量:5087 次
发布时间:2019-06-13

本文共 2430 字,大约阅读时间需要 8 分钟。

迭代器模式

简介

Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问【委让】给外部类,使用Iterator按顺序进行遍历访问。

在程序设计中,经常有这种情况:需要从大量的数据集合中一个个地取出数据加以处理。Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。

Iterator模式的应用场景可以归纳为满足以下几个条件:

  • 访问容器中包含的内部对象
  • 按顺序访问

下面是一种比较经典的Iterator模式实现方案,该实现方案基于接口设计原则,设计了以下几个接口或类:

  • 迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集,比如提供hasNext()和next()方法。
  • 迭代器实现类:迭代器接口Iterator的实现类。可以根据具体情况加以实现。
  • 容器接口:定义基本功能以及提供类似Iterator iterator()的方法。
  • 容器实现类:容器接口的实现类。

优点

  • 实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
  • 为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。

案例

定义一个自定义的集合的功能

1 public interface MyList { 2    MyIterator iterator();//自定义迭代器 3    Object get(int index); 4    int getSize(); 5    void add(Object obj); 6 } 7 public class MyListImpl implements MyList { 8    private Object[] list; 9    private int index;10    private int size;11    public MyListImpl() {12        index = 0;13        size = 0;14        list = new Object[100];15   }16    @Override17    public MyIterator iterator() {18        return new MyIteratorImpl(this); //将自身的引用传给了迭代器19   }20    @Override21    public Object get(int index) {22        if (index > size - 1) throw new RuntimeException("超出边界了");23        return list[index];24   }25    @Override26    public int getSize() {27        return this.size;28   }29    @Override30    public void add(Object obj) {31        list[index++] = obj;32        size++;33   }34 }

 

迭代器。定义访问和遍历元素的接口

public interface MyIterator {   Object next();   boolean hasNext();}public class MyIteratorImpl implements MyIterator {   private MyList list;//自定义集合   private int index;   public MyIteratorImpl(MyList list) {       index = 0;       this.list = list;  }   @Override   public Object next() {       Object obj = list.get(index);       index++;       return obj;  }   @Override   public boolean hasNext() {       return index < list.getSize();  }}

 

适用性

访问一个聚合对象的内容而无需暴露它的内部表示

支持对聚合对象的多种遍历
为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)

public class Test {   public static void main(String[] args) {       MyList list = new MyListImpl();       list.add("a");       list.add("b");       list.add("c");​       //第一种迭代方式       for (int i = 0; i < list.getSize(); i++) {           System.out.println(list.get(i));      }​       //第二种迭代方式       MyIterator it = list.iterator();       while (it.hasNext()) {           System.out.println(it.next());      }  }}

 

2016-04-21

转载于:https://www.cnblogs.com/baiqiantao/p/5416059.html

你可能感兴趣的文章
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
测试计划
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
第一阶段冲刺06
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>
HDU 4635 Strongly connected
查看>>