基本介绍

迭代器模式(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中的应用的更多相关文章

  1. 设计模式 - 模板方法模式详解及其在Spring中的应用

    基本介绍 模板方法模式(Template Method Pattern)也叫模板模式,它在一个抽象类中公开定义了执行它的方法的模板,它的字类可以按需重写方法实现,但调用将以抽象类中定义的方式进行. 简 ...

  2. 设计模式 - 命令模式详解及其在JdbcTemplate中的应用

    基本介绍 在软件设计中,我们经常需要向某些对象发送一些请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得 ...

  3. 设计模式之迭代器模式详解(foreach的精髓)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...

  4. (十七)迭代器模式详解(foreach的精髓)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...

  5. 十七:迭代器模式详解(foreach的精髓)

    定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 从定义中可以看出,迭代器模式是为了在不暴露该对象内部表示的情况下,提供一种顺序访问聚合对象中元素的方法.这种思想在JA ...

  6. JS设计模式——工厂模式详解

    它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...

  7. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...

  8. 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器

    上周六就開始写这篇博客,之后一直耽误了.到前天才開始写.今天醒的早,就把这部分整理一下. 本文内容參考易学设计模式和马士兵的迭代器模式的视频. 了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的 ...

  9. Javascript设计模式之装饰者模式详解篇

    一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...

随机推荐

  1. A 拜访奶牛

    时间限制 : - MS   空间限制 : 65536 KB  评测说明 : 时限1000ms 问题描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1< ...

  2. A - A FZU - 2205

    A - A FZU - 2205 一个国家有 N 个城市,国王不希望国家中存在三个城市之间能够互相直接到达,但道路要求尽可能的多,道路是双向边,且无重边无自环. 国王希望你最好能解决这个问题.求最多存 ...

  3. Go语言笔记 (2) 变量命名与多重赋值

    变量命名 1.大小写 观摩以下代码: func main() { var m int = "你" var M int = "我" fmt.Println(m,M ...

  4. 邮件服务TLS/SSL,CA证书

     邮件服务TLS/SSL,CA证书 案例1:OpenSSL及证书服务 案例2:邮件TLS/SSL加密通信 1 案例1:OpenSSL及证书服务 1.1 问题 本案例要求熟悉OpenSSL工具的基本使用 ...

  5. MySQL学习之路7-索引、事务、函数、存储过程、游标

    索引 使用索引快速定位某列中特定值的行,不需要遍历数据表所有行. 创建索引的数据结构:BTREE and HASH. 主键也是一种索引,Primary key. show index from ord ...

  6. Django 配置访问顺序 ->MTV开发模式

    框架模式mvc m-->model 数据库 v-->view  视图 c-->controller  控件逻辑 mtv(django) m-->model 数据库 t--> ...

  7. Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!

    在Alibaba Cloud Linux 2(原Aliyun Linux 2)上线一年之际阿里云对外正式发布Alibaba Cloud Linux 2 LTS版本.LTS版本的发布对于Alibaba ...

  8. canvas 实现光线沿不规则路径运动

    canvas 实现光线沿不规则路径运动 此文章为原创,请勿转载 1.svg实现 2.canvas实现 3.坑点 svg让动画沿着不规则路径运动 查阅svg文档后发现,svg动画运动有两种实现方式,且都 ...

  9. vue 中 history 模式的配置和打包

    在使用 vue 进行项目开发中,默认的路由形式是 hash,表现形式就是 url 中始终带有 # 号,在后台管理类的项目中并不影响使用,但是在特殊场景,比如微信分享的H5链接中,微信会自动拼接参数,由 ...

  10. loadrunner post请求

    注意:loadrunner参数中的引号,需要自己加"\" post 请求,分为header 和body两个部分处理 header部分比较容易处理,使用函数实现,如web_add_h ...