本文源码: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. c++之数据的输入和输出

    ; cout<<"请输入a的值:"<<endl; cin>>a; cout<<a<<endl;

  2. SSM(Spring+SpringMVC+Mybatis)框架整合

    1.数据准备 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `admin` -- - ...

  3. 阿里云服务器部署Tornado应用

    本篇详细介绍tornado应用部署到阿里云服务器上的全过程. Tornado程序地址:github https://github.com/ddong8/ihasy.git 准备工作:阿里云服务器Cen ...

  4. MySql事务的简单使用

    4个特性 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态 一致性:在事务开始前和事务结束以 ...

  5. 1.Redux学习1,Redux

    Redux流程图如上: Action就是一条命令 Store顾名思义就是存储数据的, Reducers是一个回调函数用于处理数据,它处理完数据会返回给Store存储起来 基本流程就是:组件中用Stor ...

  6. 【1】基于OpenCV的DLL动态库隐式连接

    1DLL的作用 DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能 ...

  7. 【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能

    测试条件: 1.IAR8.30开最高等级速度优化. 2.MDK5.27正式版使用AC5开最高等级优化3,开启时间优化,测试C标准库和微库MicroLib两种. 3.MDK5.27正式版使用AC6开最高 ...

  8. JS中遍历对象属性的四种方法

    Object.keys().Object.values().Object.entries().for...in.Map (1)Object.keys(): let ex1 = {c1: 'white' ...

  9. Spring Boot 项目维护全局json数据

    1:概述 过去 我们在每一个方法中处理前端发过来的请求,需要自己构造请求数据,然后通过spring 提供的@ResponseBody 强制转为JSON数据吗,实际上出现了很多重复的代码,我么亦可以通过 ...

  10. 一道ctf-内存取证volatility的学习使用

    环境:kali 0x00 volatility官方文档 https://github.com/volatilityfoundation/volatility 在分析之前,需要先判断当前的镜像信息,分析 ...