当前位置: 首页 > 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实现英文句子中的单词顺序逆序输出的方法
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 2017年终总结、随想
  • django开发-定时任务的使用
  • input实现文字超出省略号功能
  • Java 多线程编程之:notify 和 wait 用法
  • java 多线程基础, 我觉得还是有必要看看的
  • React16时代,该用什么姿势写 React ?
  • session共享问题解决方案
  • vuex 笔记整理
  • WebSocket使用
  • 爱情 北京女病人
  • 百度小程序遇到的问题
  • 闭包--闭包之tab栏切换(四)
  • 编写高质量JavaScript代码之并发
  • 构造函数(constructor)与原型链(prototype)关系
  • ------- 计算机网络基础
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端技术周刊 2019-02-11 Serverless
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 思考 CSS 架构
  • 我的业余项目总结
  • 小而合理的前端理论:rscss和rsjs
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • UI设计初学者应该如何入门?
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (四) 虚拟摄像头vivi体验
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NetCore 如何动态路由
  • .NET基础篇——反射的奥妙
  • .NET开源快速、强大、免费的电子表格组件