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;}@Overridepublic void first() {index = 0;}@Overridepublic void next() {if (index<size){index++;}}@Overridepublic boolean isEnd() {return (index>=size);}@Overridepublic 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;}@Overridepublic 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):迭代器模式相关推荐
- Java描述设计模式(05):原型模式
一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...
- 【GOF23设计模式】迭代器模式
[GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...
- [转载] Python进阶:设计模式之迭代器模式
参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...
- 每日学一个设计模式1——迭代器模式
引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...
- 初学Java常用设计模式之——原型模式
声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...
- php迭代器实例,php设计模式之迭代器模式实例分析【星际争霸游戏案例】
本文实例讲述了php设计模式之迭代器模式.分享给大家供大家参考,具体如下: 星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿. 我们自然会 ...
- Java 设计模式之迭代器模式
一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...
- Java描述设计模式(24):备忘录模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...
- 【Java设计模式】迭代器模式
迭代器模式 1.概述 定义: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示. 2.结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储.添加.删 ...
最新文章
- Oracle 工程师离职并回踩:MySQL 糟糕透顶,强烈推荐 PostgreSQL
- 简单套路发高分文章--杨树内生和根际微生物组结构
- mysql开启日志占cpu不_使用MySQL Slow Log来解决MySQL CPU占用高的问题
- 在.net 中依据页的角色验证方式产生相匹配的菜单
- 十个问题弄清JVMGC(二)
- PWN-PRACTICE-BUUCTF-27
- 04-git 推送出现 fatal: The remote end hung up unexpectedly 解决方案
- ASP.NET中Session简单原理图
- 【心电信号】基于matlab NLM时间序列心电信号去噪【含Matlab源码 1547期】
- ‘’vr‘’全景抓鸡游戏总结
- 3D动漫游戏建模很难学?教你如何使用3DMax和ZBrush制作卡通角色
- 数据库技术-数据库概念设计
- RL策略梯度方法之(十八): Importance Weighted Actor-Learner Architecture (IMPALA)
- python避障小车_MicroPython实战:DIY一台会思考的避障车
- 【STM32+cubemx】0020 HAL库开发:以太网ENC28J60芯片和TCP、UDP简单应用
- 超神学院之天河战役计算机,《超神学院之雄兵连 第1季 天河战役篇》
- 并查集---找朋友圈个数问题,连通度问题,等的有效算法
- linux 超线程及其原理,以及如何查看是否开启了超线程
- MT6757(P25)用的ddr3 4+128内存,手机重启
- mac java调用浏览器_Mac OS:Web 浏览器意外退出或停止响应