Java描述设计模式(13):迭代器模式
本文源码: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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Cassandra repair 工具使用
前言 Cassandra是一款去中心化的分布式数据库。一份数据会分布在多个对等的节点上,即有多个副本。我们需要定期的对多个副本检查,看是否有不一致的情况。比如因为磁盘损坏,可能会导致副本丢失,这样同一份数据的多个副本就会出现不一致。 nodetool repair Cassandra提供的nodetool中提供了repair这个工具,可以用来日常巡检数据的一致性。或者当修修改了keysapce 副本配置时,也需要运行此工具。 可以通过nodetool help 'repair'查看命令帮助,如下: NAME nodetool repair - Repair one or more tables SYNOPSIS nodetool [(-h <host> | --host <host>
- 下一篇
最近学习到的Lambda表达式
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 中秋去了躺上海,在外滩上打了个卡: 紧接着学了一下Java的函数式编程,给大家整理了一下,一起学习! 一、Lambda用法 之前写Optional这个类的时候,简单说了一下Lambda是怎么用的,这里再跟大家一起回顾一下,Lambda的语法是这样的: 以Lambda语法创建线程和匿名内部类创建线程的区别(显然代码少了很多!): public static void main(String[] args) { // 用匿名内部类的方式来创建线程 new Thread(new Runnable() { @Override public void run() { System.out.println("公众号:Java3y---关注我!"); } }); // 使用Lambda来创建线程 new Thread(() -> System.out.println("公众号:Java3y---关注我!")); } 使用Lambda表达式,实际就是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Hadoop3单机部署,实现最简伪集群