设计模式之迭代器模式

写在前面

本文一起看下一种行为型设计模式,迭代器模式。

1:介绍

1.1:什么时候使用迭代器设计模式

当对象的内部有一批数据,希望能够对外暴露访问,但因为如下的原因不希望外部直接访问内部的具体存储数据的元素:

1:内部元素具体是什么结构是不稳定的,可能会随时改变,改变后,之前的客户端代码将不可用
2:内部元素直接暴露可能会引起数据的安全问题,外部有意或者是无疑的数据修改,会引起不可预知的bug

此时,就可以考虑使用迭代器设计模式。

1.2:UML类图

原型设计模式,包含如下元素:

1:Iterable可迭代接口,定义了可以获取数据的迭代器
2:Iterator迭代器接口,定义了具体迭代获取数据的方法
4:客户端通过迭代器获取数据    

2:实例

源码 。

2.1:场景

记得大学时,总是时常会逃课,在寝室聊大天,睡大觉,但,一旦,好基友发来消息:“老师点名了!!!”,此时的我们,用百米冲刺的速度冲向教师,现在想起来只有一个感觉“累,是真的累到喘不过气”。今天,我们就以老师点名为场景来共同学习迭代器设计模式,也以此来缅怀美好的大学时光,缅怀逝去的被挥霍的青春!!!

2.2:程序

  • 可迭代接口
    该接口说明该类是可被迭代的,可以通过某方法获取一个迭代器:
public interface MyIterable<T> {MyIterator <T> iterator();
}

通过iterator方法获取了迭代器MyIterator,下面来定义。

  • 迭代器
public interface MyIterator<T> {boolean hasNext();T next();
}
  • 定义学生
@AllArgsConstructor
@ToString
public class Student {private String name;private int age;
}
  • 定义课堂
/public class Classs implements Iterable<Student> {
public class Classs implements MyIterable<Student> {private final List<Student> students = new ArrayList<>();public Classs() {students.add(new Student("王二狗", 28));students.add(new Student("牛翠花", 20));students.add(new Student("林蛋大", 29));}public boolean addStudent(Student student){return students.add(student);}public boolean removeStudent(Student student){return students.remove(student);}@Overridepublic MyIterator<Student> iterator() {return new Itr();}private class Itr implements MyIterator<Student> {int index = 0;@Overridepublic boolean hasNext() {if (index < students.size()) {return true;}return false;}@Overridepublic Student next() {Student student = students.get(index);index++;return student;}}
}
  • 测试
 @Test
public void checkAttendance(){Classs cls= new Classs();System.out.println("--------------开始点名--------------");
//        Iterator<Student> iterator= cls.iterator();MyIterator<Student> iterator= cls.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}
}

输出:

--------------开始点名--------------
Student(name=王二狗, age=28)
Student(name=牛翠花, age=20)
Student(name=林蛋大, age=29)Process finished with exit code 0

写在后面

其实迭代器设计模式在jdk中已经提供了实现,并得到了广泛的应用,其中的可迭代接口是java.lang.Iterable,迭代器接口是java.util.Iterator,我们肯定经常写如下的代码:

List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){System.out.println(it.next()); 
}

其实就是在使用迭代器设计模式。所以,如果是工作中真的需要迭代器设计模式来解决问题,可迭代接口和迭代器接口是不需要自己定义的,直接使用jdk定义的就行了,因为使用jdk定义,还能带来额外的好处,比如可以使用增强for循环等。

参考文章列表

秒懂设计模式之迭代器模式(Iterator Pattern) 。

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

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

相关文章

[JAVAee]线程安全

目录 线程安全的理解 线程不安全的原因 ①非原子性 ②可见性 ③代码重排序 体会何为不安全的线程 保证线程安全 一个代码在多线程的环境下就很容易出现错误. 线程安全的理解 线程安全是什么呢?通俗的来讲,线程安全就是在多线程的环境下,代码的结果是符合我们预期的,就…

MFC第二十一天 CS架构多页面开发与数据交互、CImageList图像列表介绍 、CListCtrl-SetItem设置列表项的方法

文章目录 CImageList图像列表介绍CListCtrl图标的原理CListCtrl列表图标设置CListCtrl-SetItem设置列表项的方法 CS架构多页面开发与数据交互添加用户实现向导多页数据交互pch.hCLientXq.h CAppCPage1.hCPage1.cppCPage2.hCPage2.cppCWorkerDlg .hCWorkerDlg.cpp 多页数据修改C…

【高危】Atlassian Confluence 远程代码执行漏洞

漏洞描述 Confluence 是由 Atlassian 开发的知识管理与协同软件&#xff0c;通常在企业内部用作wiki系统。 Confluence 7.19.8到8.2.0之前的版本中存在远程代码执行漏洞&#xff0c;具有登录权限的攻击者无需用户交互即可在 Confluence 服务器中执行任意命令。 漏洞名称Atlass…

微服务之配置中心

什么是配置中心 配置&#xff1a;就是springboot中的application.yml/properties文件 比如&#xff1a;项目名、端口号、数据库连接参数、启动参数等。 配置中心&#xff1a;配置中心就是用来管理项目当中所有配置的系统&#xff0c;也是微服务系统当中不可或缺的一部分。 只需…

C++---string模拟实现

string模拟实现 构造函数和析构函数begin和endreserve和resizepush_back和appendc_strempty&#xff0c;size&#xff0c;capacity&#xff0c;clear拷贝构造和赋值和比较大小[]重载insert和erasefind查找 前面我们已经对string进行了简单的介绍&#xff0c;只要会用各个函数即…

【Boost搜索引擎项目】

文章目录 一、项目流程二、项目展示 一、项目流程 1.编写数据去标签模块–parser.cc 将去标签之后干净文档以title\3content\3url\ntitle\3content\3url\n格式放入同一文件中。 2.建立索引模块–index.hpp 读取处理好的行文本文件进行分词、权重计算等操作&#xff0c;在内存中…

war包读取properties配置文件错误,返回null

现象&#xff1a;使用intellij Idea编写java项目&#xff0c;debug调试时&#xff0c;使用redis.properties文件的类A&#xff0c;A的代码可以使用 “InputStream in RedisUtils.class.getClass().getResourceAsStream("/" proPath);” 方式正常读取redis.propert…

【云驻共创】CodeArts Repo ---高效代码协同开发之旅

目录 一、代码托管发展史 1.1 第一代 1.2 第二代 1.3 第三代 二、CodeArts Repo 介绍 二、CodeArts Repo 功能架构 2.1 研发协同 2.2 代码管理功能 2.3 代码存储特性 三、CodeArts Repo 技术能力 三、华为云代码托管技术发展历程 四、CodeAr…

ubuntu挂载ext4文件系统

文章目录 1.虚拟机分配10G磁盘用来挂载ext4文件系统2.磁盘分区3.创建文件系统4.挂载文件系统5.卸载文件系统6.使用ior测试ext4三种日志模式&#xff08;1&#xff09;ordered&#xff08;2&#xff09;journal&#xff08;3&#xff09;writeback 1.虚拟机分配10G磁盘用来挂载e…

SpringBoot项目修改Tomcat版本号

SpringBoot项目修改Tomcat版本号 前言如果项目是以jar包形式打包部署如果项目是以war包形式打包部署示例 仰天大笑出门去&#xff0c;我辈岂是蓬蒿人 前言 Springboot项目,默认是使用内嵌Tomcat servlet容器形式打包部署。关于怎么修改默认的版本号&#xff0c;捣鼓了好久终于…

PostgreSQL 设置时区,时间/日期函数汇总

文章目录 前言查看时区修改时区时间/日期操作符和函数时间/日期操作符日期/时间函数&#xff1a;extract&#xff0c;date_part函数支持的field 数据类型格式化函数用于日期/时间格式化的模式&#xff1a; 扩展 前言 本文基于 PostgreSQL 12.6 版本&#xff0c;不同版本的函数…

基于STM32设计的人体健康监护系统(华为云IOT)

一、设计需求 1.1 设计需求总结 根据需求,要求设计一款基于 STM32 的人体健康监护系统。采用系统模块化思路进行,将多个数模传感器收集到的数据和操作指令一并送至 STM32 中心处理器进行处理分析。 该系统可以实时监测被测者的心率、体温以及周围环境的温度,也同时可以通…

(vue)vue项目中引入外部字体

(vue)vue项目中引入外部字体 效果&#xff1a; 第一步 放置字体包&#xff0c;在assets下创建一个fonts文件夹&#xff0c;放入下载的字体文件 第二步 创建一个font.css文件用于定义这个字体包的名字 第三步 在App.vue的css中将这个css文件引入 第四步 页面使用 font-famil…

Qt : day1

1.聊天界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug() << this->size(); //获取当前页面尺寸this->setFixedSize(500, 600); //设置固定尺寸this->setWindowTitle("聊天框"); //设置窗口…

单Bank OTA升级:STM32G071 APP (二)

接上一篇文章&#xff1a;单Bank OTA升级&#xff1a;STM32G071 BootLoader (一)&#xff1a;跳转链接 什么是单Bank升级&#xff1a;将Flash划分为以下3个区域。 BootLoader区&#xff1a;程序进行升级的引导程序&#xff0c;根据Upade_Flag来判断跳转Bank区运行程序或是接收…

SSL证书是什么?

SSL证书是什么&#xff1a;SSL证书&#xff08;Secure Sockets Layer Certificate&#xff09;是一种数字证书&#xff0c;用于在计算机网络上进行安全通信。它可以验证通信双方的身份&#xff0c;并通过加密传输数据来实现安全通信。 SSL证书申请&#xff1a;通常&#xff0c…

安卓开发后台应用周期循环获取位置信息上报服务器

问题背景 最近有需求&#xff0c;在APP启动后&#xff0c;退到后台&#xff0c;还要能实现周期获取位置信息上报服务器&#xff0c;研究了一下实现方案。 问题分析 一、APP退到后台后网络请求实现 APP退到后台后&#xff0c;实现周期循环发送网络请求。目前尝试了两种方案是…

Spring 中一个少见的引介增强 IntroductionAdvisor

我们平时做 AOP 开发的时候&#xff0c;基本上都是增强某一个方法&#xff0c;在某一个方法执行之前或者执行之后做一些事情&#xff0c;这种叫做 PointcutAdvisor&#xff0c;实际上&#xff0c;Spring 中的 Advisor 大致可以分为两种类型&#xff0c;除了 PointcutAdvisor 之…

Openlayers实战,Openlayers实现一个车辆转向运动轨迹动画,支持根据轨迹运动方向自动改变车头转向角度,无需定时器,丝滑小车转向运动效果

专栏目录: OpenLayers入门教程汇总目录 前言 本章作为OpenLayers入门文章《OpenLayers入门,OpenLayers动画效果实现,OpenLayers实现轨迹运动动画》的的增强进阶篇章,实现了入门教程中没有实现的小车车头方向根据运动方向自动转向的功能。 本章代码不使用任何setTimeout和…

金融中的数学:贝叶斯公式

1.贝叶斯定理 贝叶斯定理是概率论中的一项重要定理&#xff0c;用于在已知某一事件的条件下&#xff0c;求另一事件发生的概率。它是根据条件概率推导出来的&#xff0c;得名于英国数学家托马斯贝叶斯。 贝叶斯定理可以表示为&#xff1a; 这个式子就是贝叶斯公式&#xff0c…