当前位置: 首页 > news >正文

设计模式-迭代器模式

目录

一:基本介绍

二:原理说明

三:案例说明

四:优点

五:缺点


一:基本介绍

1)属于行为模式

2)如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户 端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑迭代器模式解决

3)迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部结构

二:原理说明

1)Iterator:迭代器接口,是系统提供,含有hasNext, next, remove

2)ConcreteIterator:具体的迭代器类,管理迭代

3)Aggregate:一个统一的聚合接口,将客户端和具体的聚合解耦

4)ConcreateAggreage:具体的聚合,持有对象集合

5)ClientL:客户端,通过Iterator和Aggregate依赖子类

三:案例说明

// 系
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {private String name;private String desc;
}
public class ComputerCollegeIterator implements Iterator {// 这里我们需要知道Department是以怎样的方式存放 ==>数组Department[] departments;// 遍历的位置int position = 0;public ComputerCollegeIterator(Department[] departments) {this.departments = departments;}// 判断是否还有下一个@Overridepublic boolean hasNext() {if (position >= departments.length || departments[position] == null) {return false;} else {return true;}}@Overridepublic Object next() {Department department = departments[position];position +=1;return department;}// 删除的方法默认空实现public void remove() {}
}
public class InfoColleageIterator implements Iterator {List<Department> departmentList;// 信息工程学院是以list的方式存放系int index = -1;// 索引public InfoColleageIterator(List<Department> departmentList) {this.departmentList = departmentList;}// 判断list中还有没有下一个元素@Overridepublic boolean hasNext() {if (index >= departmentList.size() - 1) {return false;} else {index += 1;return true;}}@Overridepublic Object next() {return departmentList.get(index);}// 空实现removepublic void remove() {}
}
public class ComputerCollege implements College {Department[] departments;int numOfDepartments = 0;// 保存当前数组的个数public ComputerCollege() {departments = new Department[5];addDepartment("java", "java");addDepartment("php", "php");addDepartment("大数据", "大数据");}@Overridepublic String getName() {return "计算机学院";}@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departments[numOfDepartments] = department;numOfDepartments++;}@Overridepublic Iterator createIterator() {return new ComputerCollegeIterator(departments);}
}
public class InfoCollege implements College{List<Department> departmentList;public InfoCollege() {departmentList = new ArrayList<Department>();addDepartment("信息安全专业", "信息安全专业");addDepartment("网络安全专业", "网络安全专业");addDepartment("服务器安全专业", "服务器安全专业");}@Overridepublic String getName() {return "信息工程学院";}@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departmentList.add(department);}@Overridepublic Iterator createIterator() {return new InfoColleageIterator(departmentList);}
}
public interface College {public String getName();// 增加系的方法public void addDepartment(String name, String desc);// 返回一个迭代器遍历public Iterator createIterator();}
public class OutPutImpl {// 学院集合List<College> collegeList;public OutPutImpl(List<College> collegeList) {this.collegeList = collegeList;}// 遍历所有的学院,然后调用printDepartment 输出各个学院的系public void printCollege() {// 从collegeList取出所有学院Iterator<College> iterator = collegeList.iterator();while (iterator.hasNext()) {// 取出一个学院College college = iterator.next();System.out.println("College: " + college.getName());printDepartment(college.createIterator());}}// 学院输出系public void printDepartment(Iterator iterator) {while (iterator.hasNext()) {Department department = (Department) iterator.next();System.out.println(department.getName());}}
}
public class Client {public static void main(String[] args) {// 创建学院ArrayList<College> colleges = new ArrayList<>();ComputerCollege computerCollege = new ComputerCollege();InfoCollege infoCollege = new InfoCollege();colleges.add(computerCollege);colleges.add(infoCollege);OutPutImpl outPut = new OutPutImpl(colleges);outPut.printCollege();}
}

四:优点

1)提供了统一的遍历方法,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了

2)隐藏了聚合的内部结构,客户端要遍历聚合的时候,只能取到迭代器,而不会周到聚合的具体组成

3)当要展示一组相似对象,或者遍历一组相同对象时使用,适合使用迭代器模式

五:缺点

每个聚合对象都要有一个迭代器,会生成许多迭代器不好管理类

相关文章:

  • 使用SQLite
  • 从面试角度了解前端基础知识体系
  • JavaFX HTMLEditor
  • 双色球预测算法(Java),——森林机器学习、时间序列
  • 华润的超市卡有什么用?
  • 发力采销,京东的“用户关系学”
  • 【SQL server速成之路】函数
  • 2406c++,iguana动态反射
  • 【SCAU数据挖掘】数据挖掘期末总复习题库判断题及解析
  • C++之结构体初始化使用总结
  • 边缘微型AI的宿主?—— RISC-V芯片
  • 【教师资格证考试综合素质——法律专项】教师法笔记以及练习题
  • 『大模型笔记』斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来
  • 如何在小程序中实现页面之间的返回
  • [Qt] Qt Creator 编码警告:warning:C4819
  • centos安装java运行环境jdk+tomcat
  • CSS盒模型深入
  • eclipse(luna)创建web工程
  • HomeBrew常规使用教程
  • Invalidate和postInvalidate的区别
  • python3 使用 asyncio 代替线程
  • python大佬养成计划----difflib模块
  • 创建一种深思熟虑的文化
  • 动态规划入门(以爬楼梯为例)
  • 番外篇1:在Windows环境下安装JDK
  • 仿天猫超市收藏抛物线动画工具库
  • 缓存与缓冲
  • 机器学习学习笔记一
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 入门到放弃node系列之Hello Word篇
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Maven错误Error executing Maven
  • #QT(QCharts绘制曲线)
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (3)llvm ir转换过程
  • (4)logging(日志模块)
  • (7)摄像机和云台
  • (arch)linux 转换文件编码格式
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Matlab)使用竞争神经网络实现数据聚类
  • (初研) Sentence-embedding fine-tune notebook
  • (转)iOS字体
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • ***原理与防范
  • .CSS-hover 的解释
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net7 环境安装配置
  • .NET下ASPX编程的几个小问题
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C++基础]-初识模板