1. 迭代器模式概念

迭代器模式可能是JAVA中最广为人知的模式之一,JAVA程序员在使用集合时,并不需要关注其类型是List、Set还是其他的,因为它们的遍历都可以通过迭代器来完成。迭代器模式在客户访问类和聚合类之间插入,分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节,满足单一职责原则和开闭原则。

迭代器模式优点:

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 遍历任务交由迭代器完成,这简化了聚合类。
  • 增加新的聚合类和迭代器类都很方便,无须修改原有代码。

迭代器模式缺点:

  • 增加了类的个数,这在一定程度上增加了系统的复杂性。

迭代器模式类图如下:

  • 抽象聚合(Aggregate):也叫抽象容器,定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  • 具体聚合(ConcreteAggregate):也叫具体容器,实现内部不同结构,返回一个迭代器实例。
  • 抽象迭代器(Iterator):定义访问和遍历聚合元素的接口。
  • 具体迭代器(ConcreteIterator):实现抽象迭代器接口中的方法,完成对聚合对象的遍历,记录遍历的当前位置。

2. 迭代器模式案例

通过迭代器模式实现一个简单的ArrayList,功能包括:添加元素、删除元素、获取元素、遍历元素、获取元素个数。

2.1 抽象迭代器

新建抽象迭代器接口定义迭代器行为,接口名称为Iterator,内容如下:

public interface Iterator<T> {/*** 是否有下一个元素*/Boolean hasNext();/*** 返回下一个元素*/T next();
}

2.2 抽象聚合

新建抽象聚合接口用来定义集合的行为,接口名称为Aggregate,内容如下:

public interface Aggregate<T> {/*** 添加元素* @param item 元素*/void addItem(T item);/*** 删除元素* @param item 元素* @return*/void remove(T item);/*** 获取元素*/T getItem(Integer index);/*** 获取元素总个数*/Integer size();/*** 获取迭代器*/Iterator<T> iterator();}

2.3 具体迭代器

新建具体迭代器类实现抽象迭代器,类名为ConcreteIterator,内容如下:

public class ConcreteIterator<T> implements Iterator<T> {/*** 聚合对象*/private Aggregate aggregate;/*** 游动的索引指针*/private Integer position;public ConcreteIterator(Aggregate aggregate){this.aggregate = aggregate;position = 0;}@Overridepublic Boolean hasNext() {// 当索引指针没有游动到最后表示还有元素可以遍历return position < aggregate.size() ;}@Overridepublic T next() {if (hasNext()) {// 返回索引指针处的元素return (T) aggregate.getItem(position++);}return null;}
}

2.4 具体聚合

新建具体聚合类实现抽象聚合,类名称为ConcreteAggregate,内容如下:

public class ConcreteAggregate<T> implements Aggregate<T> {/*** 数组容器初始大小*/public static final Integer INIT_SIZE = 10;/*** 元素个数*/private Integer size;/*** 实际容器*/private Object[] array;public ConcreteAggregate(){array = new Object[INIT_SIZE];size = 0;}@Overridepublic void addItem(T item) {if (size < array.length){// 容量满足array[size++] = item;} else {// 容量不够,需要扩容Object[] newArray = new Object[size + size / 2];System.arraycopy(array, 0, newArray, 0, size);newArray[size++] = item;array = newArray;}}@Overridepublic void remove(T item) {for (int index = 0; index < array.length; index++) {if (array[index].equals(item)){Object[] newArray = new Object[size - 1];// 复制删除元素位置前的元素System.arraycopy(array, 0, newArray, 0, index);// 复制删除元素位置后的元素System.arraycopy(array, index + 1, newArray, index, size - index - 1);array = newArray;size -= 1;break;}}}@Overridepublic T getItem(Integer index) {return (T) array[index];}@Overridepublic Integer size() {return size;}@Overridepublic Iterator<T> iterator() {return new ConcreteIterator<>(this);}
}

2.5 客户端

新建客户端测试容器功能和迭代功能,内容如下:

public class Client {public static void main(String[] args) {// 创建一个自定义容器Aggregate<String> aggregate = new ConcreteAggregate<>();// 给容器添加20个元素for (int index = 0; index < 20; index++) {aggregate.addItem("Hello World " + index);}System.out.println("删除前的size = " + aggregate.size());// 移除容器中的某个元素aggregate.remove("Hello World 3");System.out.println("删除后的size = " + aggregate.size());// 获取迭代器进行迭代输出Iterator<String> iterator = aggregate.iterator();int i = 0;while (iterator.hasNext()){System.out.println(String.format("item[%d] = %s", ++i, iterator.next()));}}
}

3. 迭代器模式应用

如今,迭代器在大多数编程语言中都很流行,它可能是JAVA中使用最广泛的集合包,当使用循环遍历集合时,它也在语言级别实现:

for (String item : list) {System.out.println("item = " + item);
}

在JAVA语言的ArrayList中有如下结构:

  • Collection是JAVA集合类的顶级接口,里面定义了获取元素个数、获取迭代器、添加元素、移除元素等方法。
  • Iterable是可迭代性的标志,该接口定义了获取迭代器的方法,迭代器的接口是Iterator,定义了hasNext和next方法。
  • ArrayList是具体的聚合类,继承了AbstractList抽象类,在这个抽象类中使用内部类Itr来实现迭代器接口充当具体迭代器。

设计模式之迭代器模式相关推荐

  1. 【GOF23设计模式】迭代器模式

    [GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...

  2. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

  3. 每日学一个设计模式1——迭代器模式

    引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...

  4. php迭代器实例,php设计模式之迭代器模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之迭代器模式.分享给大家供大家参考,具体如下: 星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿. 我们自然会 ...

  5. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 设计模式复习-迭代器模式

    Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...

  7. php foreach 循环 判断index 小于多少_PHP设计模式之迭代器模式 - 硬核项目经理

    一说到这个模式,就不得不提循环语句.在<大话设计模式>中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得.任何语言都有这种类似的语法可以方便 ...

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

    一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...

  9. 设计模式:迭代器模式(Iterator)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  10. Android设计模式之——迭代器模式

    一.介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一.迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List.Map ...

最新文章

  1. 一个mac地址对应多个ip_一个关于IP与mac地址绑定的故障
  2. 从Jenkins迁移到Jenkins X:一场持续交付之旅\n
  3. java连接腾讯云上的redis
  4. 通过实例理解 RabbitMQ 的基本概念
  5. 4.6 前向和反向传播-深度学习-Stanford吴恩达教授
  6. 【linux】 redhat中设置时区
  7. 常用PHP函数整理!
  8. linux下载b站的视频+ffmpeg抽取出mp3
  9. [react] 可以使用TypeScript写React应用吗?怎么操作?
  10. Java中String相关类型的区别
  11. Python与Java-你首选哪个?
  12. 在Windows 10中使用TortoiseGit进程gitlab仓库的管理
  13. 20190602:JDBC的增删改操作实践
  14. Talos实验室深入我国DDoS黑市DuTe 揭露各种DDoS团伙、平台、工具及攻击
  15. 活动回顾 I 《传奇动物园》项目团队沙盘演练圆满结束!
  16. yyuc php,yyuc框架介绍
  17. 微信红包封面催生暴利灰产:有人月入三十万
  18. 突发奇想!自动化测试在测试过程中该怎样提升效率?
  19. python+vue+django高校教职工人事档案管理系统
  20. 2021年IEEE Fellow刚刚放榜!84位华人学者当选再创新高!

热门文章

  1. 看看大佬是如何空手反套白狼的?
  2. vue 控制用户只能输入正整数的方法
  3. 解决DevTools failed to load SourceMap Could not load content for .js.map HTTP error code 404 问题
  4. 【管理系列-01】你真的会做项目经理吗
  5. java中char是几个字节_关于java中char占几个字节,汉字占几个字节
  6. 电力监控系统性能测试方案
  7. yolo格式数据集处理(xml转txt)
  8. 顶尖程序员的五种思维模式,你具备吗?
  9. 中枢神经系统的网状结构,网状神经系统结构
  10. python3.6安装tkinter