设计模式之迭代器模式(上)

迭代器模式
1)概述
1.概念

存储多个成员对象(元素)的类叫聚合类(Aggregate Classes),对应的对象称为聚合对象

聚合对象有两个职责,一是存储数据,二是遍历数据。

2.概述

迭代器模式(Iterator Pattern) 提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。

3.作用

更加方便地操作聚合对象,可以灵活地为聚合对象增加不同的遍历方法。

可以访问一个聚合对象中的元素但又不需要暴露它的内部结构。

4.迭代器模式+工厂方法模式结构图

在这里插入图片描述

5.角色

Iterator(抽象迭代器):定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法。

ConcreteIterator(具体迭代器):实现了抽象迭代器接口,完成对聚合对象的遍历,在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,游标通常是一个表示位置的非负整数。

Aggregate(抽象聚合类):用于存储和管理元素对象,声明createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。

ConcreteAggregate(具体聚合类):实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。

6.代码实现

抽象迭代器

interface Iterator {//将游标指向第一个元素public void first(); //将游标指向下一个元素public void next(); //判断是否存在下一个元素public boolean hasNext();//获取游标指向的当前元素public Object currentItem(); 
}

具体迭代器

public class ConcreteIterator implements Iterator {//维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据private ConcreteAggregate objects; //定义一个游标,用于记录当前访问位置private int cursor; public ConcreteIterator(ConcreteAggregate objects) {this.objects=objects;}public void first() {  ......  }public void next() {  ......  }public boolean hasNext() {  ......  }public Object currentItem() {  ......  }
}

抽象聚合类

interface Aggregate {Iterator createIterator();
}

具体聚合类

public class ConcreteAggregate implements Aggregate {	......	public Iterator createIterator() {return new ConcreteIterator(this);}......
}
7.注意

抽象迭代器接口的设计非常重要,一方面需要充分满足各种遍历操作的要求,尽量为各种遍历方法都提供声明,另一方面又不能包含太多方法,接口中方法太多将给子类的实现带来麻烦。

可以考虑使用抽象类来设计抽象迭代器,在抽象类中为每一个方法提供一个空的默认实现。

2)完整解决方案
1.结构图

在这里插入图片描述

AbstractObjectList充当抽象聚合类,ProductList充当具体聚合类,AbstractIterator充当抽象迭代器,ProductIterator充当具体迭代器。

2.代码实现
import java.util.*;//抽象聚合类
abstract class AbstractObjectList {protected List<Object> objects = new ArrayList<Object>();public AbstractObjectList(List objects) {this.objects = objects;}public void addObject(Object obj) {this.objects.add(obj);}public void removeObject(Object obj) {this.objects.remove(obj);}public List getObjects() {return this.objects;}//声明创建迭代器对象的抽象工厂方法public abstract AbstractIterator createIterator();
}//商品数据类:具体聚合类
public class ProductList extends AbstractObjectList {public ProductList(List products) {super(products);}//实现创建迭代器对象的具体工厂方法public AbstractIterator createIterator() {return new ProductIterator(this);}
} //抽象迭代器
interface AbstractIterator {//移至下一个元素public void next(); //判断是否为最后一个元素public boolean isLast(); //移至上一个元素public void previous(); //判断是否为第一个元素public boolean isFirst(); //获取下一个元素public Object getNextItem(); //获取上一个元素public Object getPreviousItem(); 
}//商品迭代器:具体迭代器
public class ProductIterator implements AbstractIterator {private ProductList productList;private List products;//定义一个游标,用于记录正向遍历的位置private int cursor1; //定义一个游标,用于记录逆向遍历的位置private int cursor2; public ProductIterator(ProductList list) {//获取集合对象this.productList = list;this.products = list.getObjects(); //设置正向遍历游标的初始值cursor1 = 0; //设置逆向遍历游标的初始值cursor2 = products.size() -1; }public void next() {if(cursor1 < products.size()) {cursor1++;}}public boolean isLast() {return (cursor1 == products.size());}public void previous() {if (cursor2 > -1) {cursor2--;}}public boolean isFirst() {return (cursor2 == -1);}public Object getNextItem() {return products.get(cursor1);} public Object getPreviousItem() {return products.get(cursor2);} 	
}

客户端类

public class Client {public static void main(String[] args) {List products = new ArrayList();products.add("倚天剑");products.add("屠龙刀");products.add("断肠草");products.add("葵花宝典");products.add("四十二章经");AbstractObjectList list;AbstractIterator iterator;list = new ProductList(products); //创建聚合对象iterator = list.createIterator();	//创建迭代器对象System.out.println("正向遍历:");	while(!iterator.isLast()) {System.out.print(iterator.getNextItem() + ",");iterator.next();}System.out.println();System.out.println("-----------------------------");System.out.println("逆向遍历:");while(!iterator.isFirst()) {System.out.print(iterator.getPreviousItem() + ",");iterator.previous();}}
}

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

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

相关文章

Go语言不能常量取址!?

题如下图 在软件开发中&#xff0c;常量是一种重要的编程元素&#xff0c;它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中&#xff0c;常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如&#xff1a; const a …

【Java EE】关于Spring MVC 响应

文章目录 &#x1f38d;返回静态页面&#x1f332;RestController 与 Controller 的关联和区别&#x1f334;返回数据 ResponseBody&#x1f38b;返回HTML代码片段&#x1f343;返回JSON&#x1f340;设置状态码&#x1f384;设置Header&#x1f338;设置Content-Type&#x1f…

MySQL高级(索引分类-聚集索引-二级索引)

目录 1、主键索引、唯一索引、常规索引、全文索引 2、 聚集索引、二级索引 3、回表查询 4、通过id查询和通过name查询那个执行效率高&#xff1f; 5、 InnoDB主键索引的 B tree 高度为多高呢&#xff1f; 1、主键索引、唯一索引、常规索引、全文索引 在MySQL数据库&#xff0c…

[【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

微信小程序picker设置了系统年度,打开选择年份从1年开始显示

背景&#xff1a;开发微信小程序时&#xff0c;使用了picker组件&#xff0c;设置值为当前系统时间年份&#xff0c;可以正常回显年份。但是打开面板选择年份的时候&#xff0c;默认从一年开始显示的。如下图所示。 原因&#xff1a;因为绑定的年份字段为Number类型。 解决方案…

文心一言 vs. GPT-4: 全面比较

1. 训练数据和预训练 文心一言 训练数据&#xff1a;文心一言是由中国研究人员开发的中文语言模型。它主要在大量古典中文文学作品上进行训练&#xff0c;包括诗歌、散文和历史文本。这些文学作品涵盖了丰富的中文语言和文化&#xff0c;使得文心一言在传统文化方面具有独特优…

React中State管理的4 个关键解决方案

在 React 应用开发中,状态(state)管理是非常重要的一部分。合理地管理状态可以确保组件的行为正确,提高应用的可维护性和性能。然而,在实际使用 React 的 state 时,开发者常常会遇到一些常见的问题和陷阱。 本文将从解决问题的角度,总结 React 中 state 管理的4个关键技巧: 使…

面向对象知识汇总(5)

目录 Day 5问题二十二&#xff1a;抽象类1. 抽象类概念2. 抽象类语法3. 抽象类特性4. 抽象类和普通类的区别 问题二十三&#xff1a;接口1. 接口的概念2. 接口的语法规则3. 接口的使用4. 接口的特性5. 实现多个接口6. 接口间的继承 Day 5 问题二十二&#xff1a;抽象类 1. 抽…

考研总计划篇

政治 九月份开始听徐涛老师的课&#xff0c;只需要听哲学&#xff0c;政治&#xff0c;经济学即可&#xff0c;然后用仓盾小程序刷题&#xff0c;刷题就吃饭的时候刷就是了。 工具书—苏一的提分手册&#xff0c;每天抽一个小时刷刷上面的知识点。 英语&#xff08;现在到九…

12(13)(14)-2(1)-CSS 字体图标+实战:商城首页

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 字体图标1 字体图标的产生2 字体图标的优点3 字体图标的下载4 字体图标的…

WordPress LayerSlider插件SQL注入漏洞复现(CVE-2024-2879)

0x01 产品简介 WordPress插件LayerSlider是一款可视化网页内容编辑器、图形设计软件和数字视觉效果应用程序,全球活跃安装量超过 1,000,000 次。 0x02 漏洞概述 WordPress LayerSlider插件版本7.9.11 – 7.10.0中,由于对用户提供的参数转义不充分以及缺少wpdb::prepare(),…

【第二十三篇】Burpsuite+SQL注入实现登录绕过等(靶场实战案例)

目录 Where+SQL注入获取隐藏数据SQL注入实现登录绕过Union+SQL注入获取数据库类型和版本Where+SQL注入获取隐藏数据 存在一个业务场景如下 筛选商品时,后端查询语句如下: SELECT * FROM products WHERE category = Gifts AND released = 1只有商品名匹配且该商品已发布(r…

ubuntu系统开机无限循环输入密码后黑屏【以及问题2:ls后桌面有文件但是桌面看不到】的解决方法

问题1&#xff1a;刚进来黑屏&#xff0c;无限循环输入密码后黑屏亮屏&#xff0c;然后又输入密码黑屏亮屏…… 解决方法&#xff1a;卸载重装桌面系统ubuntu-desktop那个。然后用的是在命令行startx可以进入一个新的与图形化界面&#xff0c; 然后进来界面后&#xff0c; 又遇…

使用vue3搭建一个CRM(客户关系管理)系统

目录 1. 需求分析 2. 设计 3. 技术选型 4. 开发环境搭建 5. 前端开发 6. 后端开发 7. 数据库搭建 8. 测试 9. 部署 10. 维护和迭代 总结 搭建一个CRM&#xff08;客户关系管理&#xff09;系统是一个复杂的项目&#xff0c;涉及到需求分析、设计、开发、测试和部署等…

idea中MySQL数据库的配置

在IntelliJ IDEA中配置数据库可以通过以下步骤进行&#xff1a; 打开IntelliJ IDEA&#xff0c;在菜单栏中选择"View" -> "Tool Windows" -> "Database"&#xff0c;打开Database工具窗口。 在Database工具窗口上方&#xff0c;点击"…

程序猿之路:从兴趣到职业的蜕变

水篇&#xff08;程序猿之路&#xff09; 如果硬要说自己为什么做程序员的话&#xff0c;我有故事&#xff0c;你有酒&#xff08;留言&#xff09;吗&#xff1f; 目录 记录工作实践与项目复盘 技术笔记巩固知识要点 职场感悟心得 曾经的我&#xff0c;对计算机世界充满好奇…

2024全国现代流通经济创新大会暨城郊大仓基地高质量建设论坛日程发布

2024年4月19日 中国平谷 建设城郊大仓基地 创新现代流通经济 一、大会开幕式&主论坛 时间&#xff1a;9:00-12:00 地点&#xff1a;博物馆一楼 报告厅 主持人&#xff1a;中国商业联合会商贸物流与供应链分会会长干为 08:30-09:00 大会入场&宣传片视频 09:00-0…

LeetCode 热题 100 | 多维动态规划(二)

目录 1 5. 最长回文子串 2 1143. 最长公共子序列 菜鸟做题&#xff0c;语言是 C 1 5. 最长回文子串 核心思想&#xff1a;把总问题拆解为若干子问题。 总问题&#xff1a;从第 i 个字母到第 j 个字母是回文串子问题&#xff1a;从第 i 1 个字母到第 j - 1 个字母是回文…

SSH和telnet的了解

90%的中大型企业都会选用SSH&#xff1f;8分钟让你明白它赢在哪里&#xff01;附实验操作_哔哩哔哩_bilibili 远程登录的安全协议SSH&#xff08;会进行加密&#xff09; &#xff08;公有密钥&#xff0c;私有密钥&#xff09; 公有密钥大家都可以获得。 &#xff08;为了…