迭代器模式详解及其在ArrayList中的应用

迭代器模式(Iterator Pattern)是 Java 中使用最多的一种模式,它可以顺序的访问容器中的元素,但不需要知道容器的内部细节

2|0模式结构

Iterator(抽象迭代器):定义遍历元素所需的基本方法

ConcreteIterator(具体迭代器):根据自己的需求实现抽象方法,完成迭代

Aggregate(抽象容器):定义对容器的基本操作

ConcreteAggregate(具体容器):抽象容器的具体实现类,iterator方法返回一个具体的迭代器

3|0举例说明

使用迭代器模式实现对数据的遍历

抽象迭代器

 

public interface Iterator<T> { boolean hasNext(); T next(); }

具体迭代器

 

public class ConcreteIterator<T> implements Iterator<T> { private List<T> list; //遍历的集合 private int index = -1; //遍历的索引 public ConcreteIterator(List<T> list) { this.list = list; } @Override public boolean hasNext() { return index < list.size() - 1; } @Override public T next() { T t = null; if (this.hasNext()) { t = list.get(++index); } return t; } }

抽象容器

 

public interface Aggregate<T> { void add(T t); void remove(T t); Iterator<T> iterator(); }

具体容器

 

public class ConcreteAggregate<T> implements Aggregate<T> { private List<T> list = new ArrayList<>(); @Override public void add(T obj) { list.add(obj); } @Override public void remove(T obj) { list.remove(obj); } @Override public Iterator<T> iterator() { return new ConcreteIterator<>(list); } }

测试类

 

public class Client { @Test public void test() { Aggregate<String> aggregate = new ConcreteAggregate<>(); aggregate.add("张三"); aggregate.add("李四"); aggregate.add("王五"); Iterator<String> iterator = aggregate.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } }

运行结果

 

张三 李四 王五

4|0模式分析

优点:

  • 提供一种统一的遍历方式,用户不需要再考虑聚合的类型,使用一种方式就可以遍历
  • 隐藏了聚合对象内部的细节,客户端遍历的时候取到的是迭代器对象,不会知道聚合的具体组成
  • 符合单一职责原则,把管理对象集合和遍历对象集合的责任分开,这样一来,集合改变只会影响到聚合对象,遍历方式改变只会影响到迭代器对象

缺点:

  • 每个聚合对象都需要一个迭代器,类的个数成对增加,增加了系统的复杂性

适用场景:

  • 当要展示一组相似对象,遍历一组相同对象时使用

5|0在 ArrayList 中的应用

Java 中的容器对象有很多,基本都涉及到迭代器,我们以 ArrayList 作为例子,剖析它是如何应用迭代器模式的。

打开 ArrayList 源码可以发现:

  • ArrayList 实现了 List 接口,使用 Object 数组存储元素
  • 在 List 接口中定义了 iterator() 以及很多对操作集合的方法
  • 在 ArrayList 中对 iterator() 进行了重写,并返回一个 Itr 对象
  • Itr 是 ArrayList 的内部类,并且实现了 Iterator 接口

综上,其基本关系就是:

当然,List 下的实现类不止 ArrayList,Iterator 下也有许多具体迭代器,它们各自有各自的实现方式,共同构建了 Java 中强大的容器类。

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值