设计模式(15):迭代器模式
介绍
- 提供一中可以遍历聚合对象的方式。又称为: 游标cursor模式
迭代器模式角色
- 抽象聚合类(Aggregate):提供了聚合相关的方法,并提供获取迭代器的方法;
- 具体集合类(ConcreteAggregate):实现了抽象聚合类;
- 抽象迭代器(Iterator):定义了迭代相关的方法;
- 具体迭代器(ConcreteIterator): 实现了抽象迭代器的方法。
场景:
- 需要以一种特定的方式遍历聚合对象;
- 聚合对象:存储数据
- 迭代器:遍历数据
开发中常见的场景
- JDK内置的迭代器(List/Set)
代码实现
- 抽象聚合类
/*** 抽象聚合类*/
public interface Aggregate {/*** 添加对象* @param obj*/void addObject(Object obj);/*** 移除对象* @param obj*/void removeObject(Object obj);/*** 获取迭代器方法* @return*/MyIterator iterator();
}
- 抽象迭代器
/*** 抽象迭代器*/
public interface MyIterator {/*** 当前游标置零*/void first(); /*** 将游标指向下一个元素*/void next(); /*** 是否存在下一个元素* @return*/boolean HasNext(); /*** 判断当前对象是否第一个元素* @return*/boolean isfirst(); /*** 判断当前对象是否最后一个元素* @return*/boolean isLast(); /*** 获取当期游标对象* @return*/Object getCurrentObj();
}
- 具体聚合类,内部类方法定义具体迭代器
public class ConcreteAggregate implements Aggregate {private List<Object> list = new ArrayList<Object>();/*** 添加对象* @param obj*/@Overridepublic void addObject(Object obj){list.add(obj);}/*** 移除对象* @param obj*/@Overridepublic void removeObject(Object obj){list.remove(obj);} /*** 获取迭代器方法* @return*/@Overridepublic MyIterator iterator() {return new ConcreteIterator();} /*** 使用内部类定义迭代器,可以直接使用外部类的属性*/private class ConcreteIterator implements MyIterator{/*** 定义游标---用于记录遍历List容器时的位置*/private int cursor; /*** 当前游标置零*/@Overridepublic void first() {cursor=0;}/*** 获取当期游标对象*/@Overridepublic Object getCurrentObj() {return list.get(cursor);} /*** 将游标指向下一个元素*/@Overridepublic void next() {if(cursor<list.size()){cursor++;}}/*** 是否存在下一个元素*/@Overridepublic boolean HasNext() {if(cursor<list.size()){return true;}return false;}/*** 判断当前对象是否第一个元素*/@Overridepublic boolean isfirst() {return cursor==0?true:false;}/*** 判断当前对象是否最后一个元素*/@Overridepublic boolean isLast() {return cursor==(list.size()-1)?true:false;}}
}
- 测试调用
public static void main(String[] args) {Aggregate cma = new ConcreteMyAggregate();cma.addObject("aaa");cma.addObject("bbb");cma.addObject("ccc");MyIterator iterator=cma.iterator();while(iterator.HasNext()){System.out.println(iterator.getCurrentObj());iterator.next();}System.out.println("----------------------------------");cma.removeObject("bbb");MyIterator iter=cma.iterator();while(iter.HasNext()){System.out.println(iter.getCurrentObj());iter.next();}}
更多设计模式学习:
设计模式(1):介绍
设计模式(2):单例模式
设计模式(3):工厂模式
设计模式(4):建造者模式
设计模式(5):原型模式
设计模式(6):桥接模式
设计模式(7):装饰器模式
设计模式(8):组合模式
设计模式(9):外观模式
设计模式(10):享元模式
设计模式(11):适配器模式
设计模式(12):代理模式
设计模式(13):模板方法模式
设计模式(14):命令模式
设计模式持续更新中…
相关文章:
设计模式(15):迭代器模式
介绍 提供一中可以遍历聚合对象的方式。又称为: 游标cursor模式 迭代器模式角色 抽象聚合类(Aggregate):提供了聚合相关的方法,并提供获取迭代器的方法;具体集合类(ConcreteAggregate):实现了抽象聚合类;抽象迭代器(Iterator):…...
前端内部技术分享---前端组件之表格组件的封装与使用(Vue3)
业务背景 在我们接触的项目中,PC端的项目中基本上百分之60或以上,都会用到表格,我们最常用的 就是element-plus 组件库,相信大家都对el-table 都比较熟悉了,但是在许许多多大同小异的界面中,每次都要写很多…...
【一】Mac 本地部署大模型
盘古开天辟地开始 # 安装brew/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"(echo; echo eval "$(/opt/homebrew/bin/brew shellenv)") >> /Users/wangxin52/.zprofileeval "$(/opt/homeb…...
vue实现相机拍摄,可录视频、拍照片、前置后置切换(简单小demo)
内容比较简单,不做过多赘述,只做分享,测试demo,功能有些缺陷,希望路过的大佬多多指正 /(*/ω\*) <script setup> import { showToast, showSuccessToast, showFailToast, showLoadingToast } from …...
【项目】牛马点评 问题汇总
如果一个人换很多个不同电话号发验证码会怎样 项目里没实现,如果让我做的话,我会获得用户的ip地址,然后存到redis里,设置个ttl比如1分钟,每次请求过来后就先看看redis里有没有这个ip,有的话就不发验证码。…...
使用 Docker Compose 部署邮件服务器
使用 Docker Compose 部署邮件服务器 很多时候为了方便, 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码,有些限制发邮箱的次数, 对于一些个人和企业来说, 有自己的域名和服务器为什么不自己搭建一个邮…...
FastAPI+React全栈开发21 探索React路由器和其他好东西
Chapter04 Setting Up a React Workflow 21 Exploring React Router and other goodies FastAPIReact全栈开发21 探索React路由器和其他好东西 So far, we have only created a couple of single-page apps that are really single pages, we haven’t touched some advance…...
Java pdfbox 给 PDF 添加文字和图片水印 并旋转45度
POM <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency> 代码: import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdf…...
微信小程序中路由跳转方式
文章目录 wx.switchTab(Object)wx.reLaunch(Object)wx.redirectTo(Object)wx.navigateTo(Object)wx.navigateBack(Object) 常见的微信小程序页面跳转方式有如下: wx.switchTab(Object):跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面&…...
Flutter应用发布前的关键iOS设备测试策略
本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…...
深入理解Linux环境配置文件:.bashrc、.bash_profile和.profile
在Linux世界中,理解各种shell配置文件如.bashrc、.bash_profile和.profile的作用和区别对于有效地管理和定制你的命令行环境至关重要。许多用户经常对这些文件的功能和使用场景感到困惑。本文旨在详细解释这些配置文件的差异、作用以及它们的正确使用方法。 .bashr…...
数据库设计规范(三大范式)
1、第一范式*(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式。 第一范式的合理遵循需要根据系统给的实际需求来确定。比如某些数据库系统中需要用到“地址”这…...
图论模板详解
目录 Floyd算法 例题:蓝桥公园 Dijkstra算法 例题:蓝桥王国 SPFA算法 例题:随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题:聪明的猴子 Floyd算法 最简单的最短路径算法,使用邻接…...
ArcGIS Pro打不开Excel?Microsoft驱动程序安装不上?
刚用ArcGIS pro的朋友们可能经常在打开xls或者xlsx文件的时候都会提示,未安装所需的Microsoft驱动程序。 怎么办呢?当然,按照提示装一下驱动就会好吗?有什么状况会出现?有什么临时替代方案呢? 全文目录&a…...
简单了解裸眼3D呈现技术
裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。 实现裸眼3D呈现的关键步骤包括: 创建立体图像源:首先需要有一…...
单元测试——Junit (断言、常用注解)
单元测试 Junit单元测试框架 使用 断言测试 使用Assert.assertEquals(message, 预期值, 实际值); 这段代码是用于在测试中验证某个方法的返回值是否符合预期。其中,"方法内部有bug"是用于在断言失败时显示的提示信息。4是预期的返回值,index…...
【蓝桥杯每日一题】4.2 全球变暖
原题链接:1233. 全球变暖 - AcWing题库 由题意可知: 需要找到淹没的岛屿的数量淹没的岛屿所具备的条件:咩有“高地”,也就是说岛屿(连通块)中的所有元素的 4 4 4-邻域中均含有’ . ’ 思路1:…...
ffmpeg点对点音视频udp协议传输
参考:https://zhuanlan.zhihu.com/p/636152437?utm_id0 ffmpeg查看可用设备: ffmpeg -list_devices true -f dshow -i dummy1、音频 局域网内两台设备间 设备1-音频: ffmpeg -f dshow -i audio"麦克风阵列 (适用于数字麦克风的英特…...
ensp华为AC+AP上线配置
AR1配置: <Huawei>system-view # 进入系统视图<Huawei>sysname R1 # 设备重命名[R1]dhcp enable # 开启DHCP功能[R1]interface GigabitEthernet0/0/0 # 进入接口 [R1-GigabitEthernet0/0/0]ip address 192.168.0.1 23 # 配置接口地址 [R1-GigabitE…...
JAVA基础02-Java语言基础以及编译准备工作
什么是JAVA语言 Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用的两个特征。 (可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
