设计模式 - 迭代器模式详解及其在ArrayList中的应用
基本介绍
迭代器模式(Iterator Pattern)是 Java 中使用最多的一种模式,它可以顺序的访问容器中的元素,但不需要知道容器的内部细节
模式结构

Iterator(抽象迭代器):定义遍历元素所需的基本方法
ConcreteIterator(具体迭代器):根据自己的需求实现抽象方法,完成迭代
Aggregate(抽象容器):定义对容器的基本操作
ConcreteAggregate(具体容器):抽象容器的具体实现类,iterator方法返回一个具体的迭代器
举例说明
使用迭代器模式实现对数据的遍历
抽象迭代器
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());
}
}
}
运行结果
张三
李四
王五
模式分析
优点:
- 提供一种统一的遍历方式,用户不需要再考虑聚合的类型,使用一种方式就可以遍历
- 隐藏了聚合对象内部的细节,客户端遍历的时候取到的是迭代器对象,不会知道聚合的具体组成
- 符合单一职责原则,把管理对象集合和遍历对象集合的责任分开,这样一来,集合改变只会影响到聚合对象,遍历方式改变只会影响到迭代器对象
缺点:
- 每个聚合对象都需要一个迭代器,类的个数成对增加,增加了系统的复杂性
适用场景:
- 当要展示一组相似对象,遍历一组相同对象时使用
在 ArrayList 中的应用
Java 中的容器对象有很多,基本都涉及到迭代器,我们以 ArrayList 作为例子,剖析它是如何应用迭代器模式的。
打开 ArrayList 源码可以发现:
- ArrayList 实现了 List 接口,使用 Object 数组存储元素
- 在 List 接口中定义了 iterator() 以及很多对操作集合的方法
- 在 ArrayList 中对 iterator() 进行了重写,并返回一个 Itr 对象
- Itr 是 ArrayList 的内部类,并且实现了 Iterator 接口
综上,其基本关系就是:

当然,List 下的实现类不止 ArrayList,Iterator 下也有许多具体迭代器,它们各自有各自的实现方式,共同构建了 Java 中强大的容器类。
(完)
设计模式 - 迭代器模式详解及其在ArrayList中的应用的更多相关文章
- 设计模式 - 模板方法模式详解及其在Spring中的应用
基本介绍 模板方法模式(Template Method Pattern)也叫模板模式,它在一个抽象类中公开定义了执行它的方法的模板,它的字类可以按需重写方法实现,但调用将以抽象类中定义的方式进行. 简 ...
- 设计模式 - 命令模式详解及其在JdbcTemplate中的应用
基本介绍 在软件设计中,我们经常需要向某些对象发送一些请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得 ...
- 设计模式之迭代器模式详解(foreach的精髓)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...
- (十七)迭代器模式详解(foreach的精髓)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...
- 十七:迭代器模式详解(foreach的精髓)
定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 从定义中可以看出,迭代器模式是为了在不暴露该对象内部表示的情况下,提供一种顺序访问聚合对象中元素的方法.这种思想在JA ...
- JS设计模式——工厂模式详解
它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...
- Java设计模式-策略模式详解
前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...
- 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器
上周六就開始写这篇博客,之后一直耽误了.到前天才開始写.今天醒的早,就把这部分整理一下. 本文内容參考易学设计模式和马士兵的迭代器模式的视频. 了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的 ...
- Javascript设计模式之装饰者模式详解篇
一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...
随机推荐
- [一起读源码]走进C#并发队列ConcurrentQueue的内部世界
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...
- Docket 容器引擎
Docker 是世界领先的软件容器平台.是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中, 然后发布到任何流行的Linux或Windows机器上,可以实现虚拟化(软件 ...
- Vim中实现PHP函数tags跳转
编译安装ctags 下载地址:http://ctags.sourceforge.net/ 下载文件:ctags-5.8.tar.gz 解压ctags:tar -zxcf ctags-5.8.tar.g ...
- MTK Android Framework用SystemProperties通过JNI调用访问系统属性
1.导包 import android.os.SystemProperties; 2. Android SystemProperties设置/读取 #设置 Systemproperties.set(n ...
- javascript入门 之 ztree(七 结点的查询)
<!DOCTYPE html> <HTML> <HEAD> <meta http-equiv="content-type" content ...
- Python 的while循环和for循环的使用
#循环 遍历 迭代 # while循环 a = 0while a <5: a =a+1 if a == 3: continueprint('我循环了')+str(a) # print ('我循环 ...
- Spring--开篇 (spring优缺点、模块组件、各个jar包详解)
Spring--开篇 分类: SSH&EJB2012-11-23 15:25 4369人阅读 评论(13) 收藏 举报 javaJavaJAVAspringSpringwebWebWEB框架 ...
- 2019-06-02 Python之微信好友数据分析以及运用Pyecharts可视化
一.库的使用说明 pass 二.微信好友信息的获取 def get_friends_info(self): #获取好像信息,返回lis列表 bot = Bot() lis = [['name', 'r ...
- [总结]最小生成树之Kruskal算法
目录 一.最小生成树的相关知识 1. 树的性质 2. 生成树 3. 最小生成树 4. 最小生成树的性质 二.Kruskal算法求最小生成树 1. 核心思想 2. 具体流程 3. 图示 4. 代码实施 ...
- 【Java】抽象类、接口
什么是抽象类? 特点: - 抽象类几乎普通类一样,除了不能实例化 - 不能实例化不代表没有构造器,依然可以声明构造器,便于子类实例化调用 - 具有抽象方法的类,一定是抽象类 abstract 抽象的 ...