当前位置: 首页 > news >正文

java 迭代器复制_java设计模式之迭代器模式

迭代器模式的定义:

迭代器模式又叫作游标模式,它提供一种按顺序访问集合/容器对象元素的一种方法,而又无须暴露集合内部表示。

迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内元素的组成结构,属于行为型设计模式。

迭代器模式的本质是把集合对象的迭代行为抽离到迭代器中,提供一致的访问接口。

迭代器模式的应用场景:

访问一个集合对象的内容而无须暴露它的内部表示。

为遍历不同的集合结构提供一个统一的访问接口。

迭代器模式的UML类图:

20201117233524502aaywnyj7j8j1rk6_0.png

由上图可以看到,迭代器模式主要包含4个角色。

抽象迭代器(Iterator):抽象迭代器负责定义访问和遍历元素的接口。

具体迭代器(ConcreteIterator):提供具体的元素遍历行为。

抽象容器(IAggregate):负责定义提供具体迭代器的接口。

具体容器(ConcreteAggregate):创建具体迭代器。

手写自定义的集合迭代器:

总体来说,迭代器模式是非常简单的。这里以遍历课程为例,我们创建一个课程集合,集合中的每一个元素都是课程对象,

然后手写一个迭代器,将每一个课程对象的信息都读出来。

首先创建集合元素Course类。

public classCourse {privateString name;publicCourse(String name) {this.name =name;

}publicString getName() {returnname;

}

}

然后创建自定义迭代器Iterator接口。

public interface Iterator{

E next();booleanhasNext();

}

创建自定义的课程集合ICourseAggregate接口,该接口主要是定义集合的一些规范,并指定迭代器对象。

public interfaceICourseAggregate {voidadd(Course course);voidremove(Course course);

Iteratoriterator();

}

接着分别实现迭代器接口和集合接口。

public class IteratorImpl implements Iterator{private Listlist;private intcursor;privateE element;public IteratorImpl(Listlist) {this.list =list;

}publicE next() {

System.out.print("当前位置 " + cursor + " : ");

element=list.get(cursor);

cursor++;returnelement;

}public booleanhasNext() {if (cursor > list.size() - 1) {return false;

}return true;

}

}

public class CourseAggregateImpl implementsICourseAggregate {privateList courseList;publicCourseAggregateImpl() {this.courseList = newArrayList();

}public voidadd(Course course) {

courseList.add(course);

}public voidremove(Course course) {

courseList.remove(course);

}public Iteratoriterator() {return new IteratorImpl(courseList);

}

}

最后编写客户端测试代码。

public classTest {public static voidmain(String[] args) {

Course java= new Course("Java架构");

Course javaBase= new Course("Java基础");

Course design= new Course("设计模式");

Course ai= new Course("人工智能");

ICourseAggregate aggregate= newCourseAggregateImpl();

aggregate.add(java);

aggregate.add(javaBase);

aggregate.add(design);

aggregate.add(ai);

System.out.println("===========课程列表==========");

printCourse(aggregate);

aggregate.remove(ai);

System.out.println("===========删除操作之后的课程列表==========");

printCourse(aggregate);

}private static voidprintCourse(ICourseAggregate aggregate) {

Iterator i =aggregate.iterator();while(i.hasNext()) {

Course course=i.next();

System.out.println("《" + course.getName() + "》");

}

}

}

迭代器模式的优点:

多态迭代:为不同的聚合结构提供一致的遍历接口,即一个迭代接口可以访问不同的集合对象。

简化集合对象接口:迭代器模式将集合对象本身应该提供的元素迭代接口抽象到迭代器中,使集合对象无须关心具体迭代行为。

元素迭代功能多样化:每个集合对象都可以提供一个和多个不同的迭代器,使得同种元素得聚合结构可以有不同得迭代行为。

解耦迭代和集合:迭代器模式封装了具体得迭代算法,迭代算法的变化不会影响到集合对象的架构。

迭代器模式的缺点:

对于简单的遍历比如数组或者有序列表,使用迭代器遍历较为繁琐。

在日常开发中,我们几乎不需要自己写迭代器。除非要定制一个自己实现的数据结构对应的迭代器,否则,开源框架提供的API完全够用。

相关文章:

  • java取文件类型_java如何通过文件描述符获取文件类型
  • java pdb_当12C PDB遇上JDBC
  • java复选框添加选中事件_Java的JTable中添加JCheckBox,点击事件处理问题,求高手指点迷津...
  • java thread类是抽象类_抽象类详解
  • 摘要认证 java_摘要认证及实现HTTP digest authentication
  • ssdp java_SSDP 简单服务发现协议
  • suse tomcat mysql_suse 安装jdk和tomcat工作记录
  • javascript java 语法_JavaScript
  • java.lang.nullpointerexception:group_为什么会出现java.lang.nullpointerexception错误
  • java数组查找指定元素_Java在数组中查找指定元素的方法
  • k8s mysql volume_k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)
  • java 能够完成多个http请求并回应_Java Web请求与响应实例详解
  • mysql 交叉查询_MySQL连接查询,内连接,外连接,全连接,交叉连接
  • java中 springurl_基于SpringMVC中的路径参数和URL参数实例
  • java句子倒序_Java实现英文句子中的单词顺序逆序输出的方法
  • es6
  • golang中接口赋值与方法集
  • Javascript Math对象和Date对象常用方法详解
  • leetcode388. Longest Absolute File Path
  • Linux各目录及每个目录的详细介绍
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Spring Boot快速入门(一):Hello Spring Boot
  • SpringBoot 实战 (三) | 配置文件详解
  • Unix命令
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 欢迎参加第二届中国游戏开发者大会
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 我从编程教室毕业
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Linux权限管理(week1_day5)--技术流ken
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (六)c52学习之旅-独立按键
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十三)Maven插件解析运行机制
  • (一)WLAN定义和基本架构转
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)memcache、redis缓存
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *2 echo、printf、mkdir命令的应用
  • .java 9 找不到符号_java找不到符号
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET delegate 委托 、 Event 事件
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...