【设计模式】 - 结构型模式 - 迭代器模式

news2024/9/23 9:34:42

目录标题

  • 前言
  • 迭代器模式
    • 概述
    • 结构
    • 实现
    • 优缺点
    • JDK源码解析

前言

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。

行为型模式分为:
模板方法模式
策略模式
命令模式
职责链模式
状态模式
观察者模式
中介者模式
迭代器模式
访问者模式
备忘录模式
解释器模式
以上 11 种行为型模式,除了模板方法模式和解释器模式是类行为型模式,其他的全部属于对象行为型模式。

迭代器模式

概述

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

结构

抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。
具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

实现

定义一个可以存储学生对象的容器对象,将遍历该容器的功能交由迭代器实现,涉及到的类如下:
在这里插入图片描述
定义迭代器接口,声明hasNext、next方法

public interface StudentIterator {
	boolean hasNext();
	Student next();
}

定义具体的迭代器类,重写所有的抽象方法

public class StudentIteratorImpl implements StudentIterator {
	private List<Student> list;
	private int position = 0;
	public StudentIteratorImpl(List<Student> list) {
		this.list = list;
	}
	@Override
	public boolean hasNext() {
		return position < list.size();
	}
	@Override
	public Student next() {
		Student currentStudent = list.get(position);
		position ++;
		return currentStudent;
	}
}

定义抽象容器类,包含添加元素,删除元素,获取迭代器对象的方法

public interface StudentAggregate {
	void addStudent(Student student);
	void removeStudent(Student student);
	StudentIterator getStudentIterator();
}

定义具体的容器类,重写所有的方法

public class StudentAggregateImpl implements StudentAggregate {
	private List<Student> list = new ArrayList<Student>(); // 学生列表
	@Override
	public void addStudent(Student student) {
		this.list.add(student);
	}
	@Override
	public void removeStudent(Student student) {
		this.list.remove(student);
	}
	@Override
	public StudentIterator getStudentIterator() {
		return new StudentIteratorImpl(list);
	}
}

优缺点

优点
它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器的子类以支持新的遍历方式。
迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足 “开闭原则” 的要求。
缺点
增加了类的个数,这在一定程度上增加了系统的复杂性。

JDK源码解析

ArrayList举例来说明
List:抽象聚合类
ArrayList:具体的聚合类
Iterator:抽象迭代器
list.iterator():返回的是实现了 Iterator 接口的具体迭代器对象

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
	public Iterator<E> iterator() {
		return new Itr();
	}
	private class Itr implements Iterator<E> {
		int cursor; // 下一个要返回元素的索引
		int lastRet = -1; // 上一个返回元素的索引
		int expectedModCount = modCount;
		Itr() {}
		//判断是否还有元素
		public boolean hasNext() {
			return cursor != size;
		}
		//获取下一个元素
		public E next() {
		checkForComodification();
		int i = cursor;
		if (i >= size)
		throw new NoSuchElementException();
		Object[] elementData = ArrayList.this.elementData;
		if (i >= elementData.length)
		throw new ConcurrentModificationException();
		cursor = i + 1;
		return (E) elementData[lastRet = i];
	}
	...
}

来源:https://www.bilibili.com/video/BV1Np4y1z7BU?p=125&spm_id_from=pageDriver&vd_source=b901ef0e9ed712b24882863596eab0ca

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

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

相关文章

ai绘画有哪些软件,盘点三款免费且超级好用的AI绘画工具

Ai绘画有哪些软件&#xff1f;不但可以免费使用&#xff0c;而且生成的画作精美&#xff0c;而且生成的图片速度还要很快&#xff1f; 不用急&#xff0c;今天小编给大家推荐的这三款ai绘画工具完全满足了上述条件&#xff01; 第一款&#xff0c;重磅级产品&#xff0c;数画…

内存 地址转换、分段、空闲空间管理

目录 1. 地址转换 1.1 动态重定位 1.1.1 基址寄存器&#xff08;虚拟地址 -> 物理地址) 1.1.2 界限寄存器&#xff08;提供访问保护&#xff09; 1.2 操作系统的工作 2. 分段 2.1 分段&#xff1a;泛化的基址/界限 2.2 引用哪个段 2.3 代码和堆的地址转换举例 2.4…

Java#23(常见API--1)

目录 一.Math Math是一个帮助我们用于进行数学计算的工具类 工具类的特点: Math类中的常用方法 二.System System是一个工具类,为我们提供一些与系统相关的办法 一.Math Math是一个帮助我们用于进行数学计算的工具类 工具类的特点: 私有化构造方法,所有的方法都是静态的 M…

[附源码]java毕业设计医院预约挂号管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

web网页设计期末课程大作业 我的美丽家乡盐城 HTML+CSS+JavaScript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Linux C应用编程-2-Makefile编写

1.基本规则 #规则格式 target ... : prerequisites ... command1command2#例如 main: main.o stack.o maze.ogcc main.o stack.o maze.o -o main main是规则的目标&#xff08;Target&#xff09;&#xff0c;main.o、stack.o和maze.o是规则的条件&#xff08;Prerequisite&am…

贴地气的安卓UI自动化工具4399AT全面更新了~

4399AT是 一款兼容多设备运行并实现全自动化的测试的安卓UI工具&#xff0c;全自动化测试是指从apk的安装到按钮点击&#xff0c;密码输入到安装完成&#xff0c;不需要人工介入&#xff0c;兼容android5.0-12.0系统大部分品牌&#xff0c;至于开始测试&#xff0c;启动apk后&a…

(十)笔记.net学习Lambda和Linq表达式

1.lambda表达式的演变 Lambda表达式的本质是“匿名方法”&#xff1a; C#的Lambda 表达式都使用 Lambda 运算符 >&#xff0c;该运算符读为“goes to”。语法如下&#xff1a; (object argOne, object argTwo) > {; /*Your statement goes here*/} 函数体多于一条语句…

一次Actuator未授权访问利用

目录 介绍 复现 Actuator目录下可能利用泄漏信息的路径 利用 思考 处理意见 介绍 事先得到同意对朋友公司的网站进行了扫描&#xff0c;扫出了一个Actuator未授权&#xff0c;于是开始复现并记录一下&#xff0c;最后获取了redis的密码 复现 这里是请求包 响应包成功返回…

qt 虚拟键盘中的几个瑕疵

最近使用了下面楼主的虚拟键盘&#xff0c;总体还是挺好用的&#xff0c;只是有几个地方&#xff0c;需要完善下。 基于Qt的可用于嵌入式的虚拟键盘_偷段代码的博客-CSDN博客_qt 嵌入式虚拟键盘这几天完成了一个基于Qt的虚拟键盘的编写&#xff0c;记录一下过程与感受&#xf…

Python操作Numpy模块库

14天学习训练营导师课程&#xff1a; 杨鑫《Python 自学编程基础》 杨鑫《 Python 网络爬虫基础》 杨鑫《 Scrapy 爬虫框架实战和项目管理》 Python操作Numpy模块库 文章目录Python操作Numpy模块库1.Numpy介绍2.Numpy安装3.Numpy模块练习3.1 创建数组3.2 获取数组3.3 切割数组…

二叉树路径问题+递归+有关题目

一、分类 1、自顶向下 顾名思义&#xff0c;就是从某一个节点(不一定是根节点)&#xff0c;从上向下寻找路径&#xff0c;到某一个节点(不一定是叶节点)结束&#xff0c;具体题目如下&#xff1a;而继续细分的话还可以分成一般路径与给定和的路径 二叉树的所有路径面试题 04…

Qt 利用UDP进行通信

一、UDP的特点 UDP&#xff08;用户数据报协议&#xff09;是一种简单轻量级、不可靠、面向数据报&#xff0c;无连接的传输层协议。而TCP/IP协议却是有连接的 二、UDP适合应用的几种情况 1、网络数据大多为短消息 2、拥有大量客户端 3、对数据安全性无特殊要求 4、网络负…

pmap gdb 分析堆外内存泄露情况

一、查看内存分部 pmap -x 8 | sort -k3 -n -r | more ---- 8 是 PID 最大的肯定是堆内存。 其他的就需要看情况来分析了。 二、cat /proc/8/smaps | grep 7fad64000000 -- 8 是 PID , 地址的前4个0需要去掉。查到起止内存地址。 7fad64000000-7fad68000000 r…

Bioinformatics2019 | FP2VEC+:基于新分子特征的分子性质预测

论文标题&#xff1a;FP2VEC&#xff1a;a new molecular featurizer for learning molecular properties 代码&#xff1a; GitHub - wsjeon92/FP2VEC 预测化合物性质最成功的方法之一是定量结构-活性关系(QSAR)方法。 Mol2vec使用分子子结构表将分子结构表示为类似于分子指…

甘露糖-聚乙二醇-CY5 Cy5-PEG-mannose

甘露糖-聚乙二醇-CY5 Cy5-PEG-mannose 中文名称&#xff1a;甘露糖-菁染料CY5 英文名称&#xff1a;mannose-Cyanine5 别称&#xff1a;CY5标记甘露糖&#xff0c;CY5-甘露糖 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取…

设计模式之美——实战MVC的意义

对于一个工程师来说&#xff0c;如果要追求长远发展&#xff0c;你就不能一直只把自己放在执行者的角色&#xff0c;不能只是一个代码实现者&#xff0c;你还要有独立负责一个系统的能力&#xff0c;能端到端&#xff08;end to end&#xff09;开发一个完整的系统。这其中的工…

《机械工程基础》复习题

一、填空题&#xff1a; 1. 构件由于受力不同&#xff0c;会产生不同的变形。基本形式有以下五种&#xff1a;1. 弯曲 &#xff1b;2. 扭转 &#xff1b; 3. 剪切 &#xff1b;4. 轴向拉伸 &#xff1b;5. 轴向压缩 。 2. 在机器中&#xff0c;运动的基本单元称之为__机构_ ___…

ip-guard安全网关问题集锦一

1、忘记安全网关Web管理界面的登录密码如何处理&#xff1f; 重置安全网关Web管理界面的登录密码操作如下&#xff1a; 1、把网线连接电脑和网管的emp端口。 2、修改电脑的Ip为190.190.190.x&#xff0c;子网掩码&#xff1a;255.255.0.0。 3、电脑上访问http://190.190.190.1…

Django Web框架的使用

1.前言 Django是基于Python的重量级开源Web框架。Django拥有高度定制的ORM和大量的API&#xff0c;简单灵活的视图编写、优雅的url、适用于快速开发的模板以及强大的管理后台。 Django简介可以查看菜鸟教程 Django 简介 | 菜鸟教程 2.使用pip安装Django 当我们更换镜像源进…