设计模式——迭代器模式

迭代器模式(落没的设计模式)

定义

它提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。

迭代器是为容器服务的,能容纳元素的对象可以称为容器,例:List、Set、Map

迭代器模式(Iterator Pattern)已经是没落的设计模式,常用的容器基本都有成熟稳定的实现,基本不会再去单独写一个迭代器。

实验小结

  1. 即一个实例对象中封装了一个集合,该类通过实现接口中的iterator方法获得一个迭代器对象,通过迭代器对象对实例中的集合进行遍历。
  2. 本质就是自己实现一个迭代器,但是目前集合的API中基本都实现了迭代器,并且结合1.8 Stream的特性,完全没有必要自己写迭代器了

代码模拟场景

老板想要查看往期项目的汇总报表,构建一个迭代器装载“项目”对象,再进行迭代展示。

迭代器模式

UML图

在这里插入图片描述

项目业务接口及实现类

/*** 项目信息接口*/
public interface IProject {// 老板要阅览的项目信息public String getProjectInfo();// 添加两个方法// 增加项目public void add(String name,int num,int cost);// 获得一个可以被遍历的对象public IProjectIterator iterator();
}public class Project implements IProject {// 定义一个项目列表,所有的项目都放这里private List<IProject> projectList = new ArrayList<>();// 项目名称private String name;// 项目成员数量private int num;// 项目费用private int cost;public Project() {}public Project(String name, int num, int cost) {this.name = name;this.num = num;this.cost = cost;}@Overridepublic String getProjectInfo() {String info = "";// 获得项目的名称info = info + "项目的名称是:" + this.name;// 获得项目人数info = info + "\t项目人数" + this.num;// 项目费用info = info + "\t项目费用" + this.cost;return info;}// 增加项目@Overridepublic void add(String name, int num, int cost) {this.projectList.add(new Project(name, num, cost));}// 获得迭代器对象@Overridepublic IProjectIterator iterator() {return new ProjectIterator(this.projectList);}
}

迭代器接口及实现类

/*** 迭代器接口*/
public interface IProjectIterator extends Iterator<IProject> {
}public class ProjectIterator implements IProjectIterator {// 所有的项目都在List中private List<IProject> projectList = new ArrayList<>();private int currentItem = 0;public ProjectIterator(List<IProject> projectList) {this.projectList = projectList;}@Overridepublic boolean hasNext() {boolean b = true;if (this.currentItem >= projectList.size() || this.projectList.get(this.currentItem) == null) b = false;return b;}@Overridepublic IProject next() {return this.projectList.get(this.currentItem++);}
}

入口类

/*** 迭代器模式*/
public class IteratorMain {public static void main(String[] args) {IProject project = new Project();project.add("星球大战项目", 10, 100000);project.add("扭曲时空项目", 100, 10000000);project.add("超人改造项目", 10000, 1000000000);for (int i = 4; i < 104; i++) {project.add("第" + i + "个项目", i * 5, i * 1000000);}// 迭代器模式IProjectIterator projectIterator = project.iterator();while (projectIterator.hasNext()) {IProject p = projectIterator.next();System.out.println(p.getProjectInfo());}}
}

结果

在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统实战45讲|01程序的运行过程、02几行汇编几行C

配置环境遇到的问题 virtualBox实现windows和Ubuntu之间的复制粘贴 1.修改设置&#xff0c;设置共享粘贴板为双向 或者在运行的虚拟机的窗口中进行设置 2.安装virtualbox增强功能 (1)直接联网安装 设备----安装增强功能 3.补充 windows中终端和文档复制的快捷键为ctrlc&…

Element Plus el-table 自定义合并行和列

原文链接&#xff1a;Element Plus el-table 自定义合并行和列 前言 目标效果是将表格行数据中某个属性值相同的项合并到一起&#xff0c;效果如下&#xff1a; <el-table :data"tableData" :span-method"spanMethod" style"width: 100%">…

Set up the compilation environment for ESP8266-RTOS-SDK using Git on Windows

Software to be installed&#xff1a; Git BashPython Environment&#xff0c;ESP8266 Master require Python v3 environment. Please check “add to PATH” while installing Open Git Bash&#xff0c;Enter a local disk&#xff0c;create an empty folder, enter the …

JVM常用参数

以下是 JVM 常用参数的配置 内存相关参数&#xff1a; -Xmx&#xff1a;指定 JVM 最大可用内存&#xff0c;例如 -Xmx2g 表示最大可用内存为 2GB。 -Xms&#xff1a;指定 JVM 初始内存大小&#xff0c;例如 -Xms512m 表示初始内存为 512MB。 -XX:MaxPermSize&#xff1a;指定…

Leap AI + Python 开发绘图应用

使用python语言&#xff0c;并借助Leap AI网站的api key&#xff0c;可以轻松实现AI绘图功能。使用时&#xff0c;用户只要输入prompt提示词&#xff0c;几秒钟之内服务器就能生成图片并返回图片的链接地址。开发人员可以利用这个功能开发个性化的绘图软件&#xff0c;或者整合…

Redis常见命令和使用示例

目录 1.使用官方文档学习redis 2.核心命令 SET GET 3.全局/通用命令 KEYS EXISTS DEL EXPIRE TTL TYPE 1.使用官方文档学习redis redis官网 点击搜索&#xff0c;输入&#xff0c;比如输入ping&#xff0c;会显示Commands,是一个命令&#xff0c;点击ping&#xff…

「深度学习之优化算法」(十二)水波算法

1. 水波算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   水波算法(Water wave optimization)是根据水波理论提出的优化算法。什么是水波理论?简单来说就是水波的宽度越小,其频率越高,频率与水波宽度的平方根成反比(具体细节我也不懂,物理方面的)。水波…

Spring AOP

Spring AOP &#x1f50e;定义&#x1f50e;AOP 的组成切面(Aspect)切点(Pointcut)通知(Advice)连接点(Join Point)总结 &#x1f50e;Spring AOPSpring AOP 的创建Spring AOP 的使用切点表达式Spring AOP 的实现原理 &#x1f50e;&#x1f338;&#x1f338;&#x1f338;完结…

报名开启 | DolphinDB 粉丝节,与你相约上海

作为量化爱好者&#xff0c;你是否在寻找更多志同道合的朋友&#xff1f; 作为技术达人&#xff0c;想探索因子挖掘、深度学习、AI领域的前沿技术&#xff1f; 7月22日 机会来了&#xff01; DolphinDB 首届线下粉丝节将于7月22日下午在上海举行&#xff01; 来现场&#xf…

面向对象进阶一(static,继承,多态)

面向对象进阶一 一、static二、继承2.1 继承的定义和特点2.2 继承内容、成员变量和成员方法的访问特点2.2.1继承内容2.2.2 成员变量的访问特点2.2.3 成员方法的访问方法、方法的重写 2.3 继承中构造方法的访问特点 三、this、super使用总结四、多态4.1 多态的基本概念4.2 多态调…

系统架构设计师-软件工程(4)

一、软件测试 1、软件测试类型&#xff08;动态测试 / 静态测试&#xff09; ● 动态测试【计算机运行】 &#xff08;1&#xff09;白盒测试法【结构测试】&#xff1a;主要用于单元测试阶段。 a&#xff1a;控制流测试【逻辑覆盖测试&#xff08;语句覆盖最弱&#…