本文源码:GitHub·点这里 || GitEE·点这里

一、迭代器模式

1、基础概念

迭代器模式又叫游标模式,是对象的行为模式。迭代器模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。

2、模式图解

3、核心角色

  • Iterator:迭代器角色

此抽象角色定义出遍历元素所需的接口。

  • ConcreteIterator:具体迭代器角色

此角色实现了Iterator接口,并保持迭代过程中的游标位置。

  • Aggregate:聚集角色

此抽象角色给出创建迭代器(Iterator)对象的接口。

  • ConcreteAggregate:具体聚集角色

聚合持有对象集合,提供返回迭代器的方法,可以正确遍历该集合。

  • Client:客户端角色

持有对聚集及其迭代器对象的引用,调用迭代器对象的迭代接口。

4、源码案例

public class C02_Iterator {
public static void main(String[] args) {
Object[] objArray = {"one","two","three","four","five"};
Aggregate aggregate = new ConcreteAggregate(objArray);
Iterator iterator = aggregate.createIterator();
while (!iterator.isEnd()){
System.out.println(iterator.currentItem());
iterator.next();
}
}
}
interface Iterator {
void first();
void next();
boolean isEnd();
Object currentItem();
}
class ConcreteIterator implements Iterator{
//持有被迭代的聚合对象
private ConcreteAggregate agg;
//记录当前迭代索引位置
private int index = 0;
//设置当前聚集对象的大小
private int size = 0;
public ConcreteIterator (ConcreteAggregate agg){
this.agg = agg;
this.size = agg.getSize();
index = 0;
}
@Override
public void first() {
index = 0;
}
@Override
public void next() {
if (index<size){
index++;
}
}
@Override
public boolean isEnd() {
return (index>=size);
}
@Override
public Object currentItem() {
return agg.getElement(index);
}
}
abstract class Aggregate {
// 创建相应迭代器对象的接口
public abstract Iterator createIterator();
}
class ConcreteAggregate extends Aggregate{
private Object[] objArray = null;
public ConcreteAggregate (Object[] objArray){
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public Object getElement (int index){
if (index<objArray.length){
return objArray[index];
} else {
return null;
}
}
public int getSize (){
return objArray.length;
}
}

二、JDK集合应用

1、简单案例

public class C02_ArrayList {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>() ;
stringList.add("One") ;
stringList.add("Two") ;
stringList.add("Three") ;
java.util.Iterator<String> itr = stringList.iterator() ;
while (itr.hasNext()){
System.out.println(itr.next());
}
}
}

2、Iterator源码

规定了集合迭代的一些方法。

public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}

3、ArrayList源码

  • 实现聚合接口List
ArrayList<E> extends AbstractList<E> implements List<E>
  • 内部迭代器接口实现
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {}
public E next() {}
public void remove() {}
public void forEachRemaining(Consumer<? super E> consumer) {}
final void checkForComodification() {}
}
  • 返回迭代器
public Iterator<E> iterator() {
return new Itr();
}

三、迭代器总结

1、适用场景

迭代器模式是与集合绑定,只要使用集合,就需要同时这个集合的迭代器,以此遍历集合中的数据,java中的容器对象Collection,List、Set、Map都有自己的迭代器。容器对象在编程语言中十分核心,所以在实现容器的时候基本都有匹配的迭代器,可以满足开发的需要,所以迭代器的自定义实践场景比较少。

2、优点总结

简化集合遍历方式,每一个聚集对象都可以有一个或多个迭代器对象,每一个迭代器的迭代状态可以是彼此独立的。遍历算法被封装在迭代器角色里面,因此迭代的算法可以独立于聚集角色变化。

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(13):迭代器模式的更多相关文章

  1. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  2. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

  3. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  4. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  5. 【设计模式】迭代器模式(Iterator )

    摘要: 1.本文将详细介绍迭代器模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入迭代器模式 2. 迭代器的概念及优缺点介绍 3. 迭代器在Android源码中的应用 1 ...

  6. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

  7. 设计模式之迭代器模式——Java语言描述

    迭代器模式是Java和.NET编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示 介绍 意图 提供一种方法顺序访问一个聚合对象中各个元素,无需暴露该对象的内 ...

  8. 折腾Java设计模式之迭代器模式

    迭代器模式 Provide a way to access the elements of an aggregate object sequentially without exposing its ...

  9. Java描述设计模式(24):备忘录模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...

随机推荐

  1. 延迟队列DelayQueue take() 源码分析

    延迟队列DelayQueue take() 源码分析 在工作中使用了延迟队列,对其内部的实现很好奇,于是就研究了一下其运行原理,在这里就介绍一下take()方法的源码 1 take()源码 如下所示 ...

  2. DS-5新加交叉编译工具

    Adding New Compiler Toolchains to DS-5 In this tutorial, you will learn how to add new compiler tool ...

  3. NodeJS4-3静态资源服务器实战_优化成近似同步写法

    实例3 上面有点回调,优化成近似同步的写法 route.js const fs =require('fs') const promisify = require('util').promisify; ...

  4. java之构造器

    1.构造方法的作用:在new创建对象时为其赋值. 2.构造方法的分类: ①无参构造public 同类名(){},有参构造public 同类名(参数列表){语句}. ②构造方法没有方法名,没有返回值类型 ...

  5. CQRS+ES项目解析-Equinox

    今天我们来分析另一个开源的CQRS+ES项目:Equinox.该项目可以在github上下载并直接本地运行,项目地址:https://github.com/EduardoPires/EquinoxPr ...

  6. TrueTime的安装、运行例程

    一.前言 Truetime的安装是为了完成课程相关需求,但在安装过程中遇到一些问题,想到自己之前注册了博客所以打算把这个作为第一篇的内容.请放心这个的安装过程并不困难,可以放心食用. 二.准备 Tru ...

  7. 重启docker服务应用,自启停命令.

    #重启docker服务应用,不自动开启docker容器 docker update --restart=no (docker容器CONTAINER ID 或 docekr容器NAMES) #重启doc ...

  8. Redis学习二(数据操作).

    key 操作 删除 key:del key 批量删除key:redis-cli -a(密码)keys "QXJ_*"| xargs redis-cli -a(密码)del 查看所有 ...

  9. Vscode LeetCode 教程

    1: 题目选区 商店安装LeetCode 以后, 选择地球确认选区 2: 选择题目 选择Code Now 进行编码 默认路径为$HOME/.leetcode/ 你可以通过更新配置项 leetcode. ...

  10. Windows服务安装批处理命令

    Install.bat: @echo off "%~dp0InstallUtil\InstallUtil.exe" "%~dp0DataSyncService.exe&q ...