Java设计模式之行为型-迭代器模式(UML类图+案例分析)

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

五、总结


一、基础概念

迭代器模式是一种常用的设计模式,它主要用于遍历集合对象,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

举个简单的比喻,聚合对象像一个存放苹果的篮子,迭代器就像篮子边上的搬运工,专门负责把苹果一个一个取出来。客户端只需要找到搬运工,然后不停地让他取出苹果就可以了,而不需要关心篮子里面是怎么存放的。这样既方便客户端使用,也屏蔽了聚合对象内部的复杂性!

二、UML类图

三、角色设计

角色描述
抽象聚合角色定义存创建、添加、获取等迭代器对象的接口
具体聚合角色抽象聚合角色的实现类,返回一个具体迭代器实例
抽象迭代器角色定义访问和遍历聚合元素的接口,通常包裹hashNext()和next()方法
具体迭代器角色实现抽象迭代器接口中所定义的方法,完成聚合对象的遍历,记录遍历的当前为止
客户端角色用于使用迭代器遍历聚合对象

四、案例分析

用迭代器模式模拟一个学生管理系统,主要内容如下:

1、定义Student类,表示学生信息。

2、定义StudentAggregate接口,作为学生集合的抽象接口。

3、实现StudentAggregateImpl类,具体的学生集合,使用List存储Student。

4、定义Iterator接口,规定迭代器的通用方法。

5、实现StudentIterator类,具体的学生迭代器。

6、在客户端代码中,通过迭代器遍历StudentAggregateImpl中的学生集合。

通过迭代器模式实现对学生集合的遍历,同时隐藏学生集合的具体实现细节,示例代码如下:

定义学生类:

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}

学生集合抽象聚合类:


public interface StudentAggregate {public Iterator createIterator();public int getNumberOfStudents();public Student getStudent(int index);public void addStudent(Student student);}

学生集合具体聚合角色:

import java.util.ArrayList;
import java.util.List;public class StudentAggregateImpl implements StudentAggregate{private List<Student> students;public StudentAggregateImpl() {students = new ArrayList<>();}@Overridepublic Iterator createIterator() {return new StudentIterator(this);}  @Overridepublic int getNumberOfStudents() {return students.size();}@Overridepublic Student getStudent(int index) {return students.get(index);}@Overridepublic void addStudent(Student student) {students.add(student);}
}

 抽象迭代器角色:

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

学生具体迭代器角色:

public class StudentIterator implements Iterator {private StudentAggregate studentAggregate;private int index;public StudentIterator(StudentAggregate studentAggregate) {this.studentAggregate = studentAggregate;}@Overridepublic boolean hasNext() {return (index < studentAggregate.getNumberOfStudents());}@Overridepublic Student next() {return studentAggregate.getStudent(index++);}}

客户端:

public class Client {public static void main(String[] args) {//使用示例StudentAggregate students = new StudentAggregateImpl();// 添加学生Student john = new Student("John", 18);Student mike = new Student("Mike", 18);students.addStudent(john);students.addStudent(mike);Iterator iterator = students.createIterator();while(iterator.hasNext()) {Student student = iterator.next();System.out.println(student.getName());}}
}

运行结果如下:

这个迭代器模式在学生管理示例中的执行逻辑过程: 

1、定义Student类,用于表示学生信息。

2、定义StudentAggregate接口,作为抽象学生集合类,声明管理学生的通用方法。

3、实现StudentAggregateImpl类,具体的学生集合,使用List存储Student对象。

4、定义Iterator接口,规定迭代器的通用方法。

5、实现StudentIterator类,具体的学生迭代器,持有对StudentAggregate的引用。

6、创建StudentAggregateImpl对象students,表示具体的学生集合。

7、调用students的addStudent()方法,向集合中添加学生。

8、调用students的createIterator()方法,获取迭代器对象。

9、使用迭代器的hasNext()和next()方法遍历students集合,访问其中的学生对象。

10、在整个过程中,客户端代码都只与Iterator接口发生依赖,而不需了解学生集合的具体实现/

这样通过迭代器模式可以实现学生集合的遍历,同时也达到了对访问学生集合的控制和集合内部表示的封装。 

五、总结

优点:

1隔离了集合对象的遍历行为,抽象出一个迭代器类来负责迭代元素。

2提供了一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。

3迭代器简化了聚合类。客户端如果需要遍历聚合对象,只需要初始化一个迭代器,不需要知道聚合对象内部的具体实现。

4在同一个聚合类中可以定义多个遍历方式,通过不同的迭代器来实现。

5符合单一职责原则。

6实现了集合类的常用遍历算法,容易扩展和维护。

缺点:

1、增加了类的个数,代码复杂度会增加,需要维护更多的代码。

2、多态性能损耗。遍历时需要进行多次虚函数调用,遍历效率降低。

3、遍历算法复用性差。每次遍历都需要创建新的迭代器实例,无法重用已定义好的遍历算法。

应用场景:

1、访问一个聚合对象的内容而无需暴露它的内部表示。

2、为遍历不同的集合结构提供一个统一的接口(即支持多态迭代)。

3、提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。

4、分离集合对象的遍历行为到一个独立的迭代器类中。

符合的设计原则:

1、单一职责原则(Single Responsibility Principle)

迭代器模式将集合对象的遍历行为抽象到迭代器类中,集合类只负责存储,迭代器类只负责遍历。二者职责区分明确,符合单一职责原则。

2、开闭原则(Open Closed Principle)

可以在不修改集合类的情况下,定义新的迭代器类,满足扩展需求。增强了系统的可扩展性。

3、依赖倒转原则(Dependency Inversion Principle)

迭代器模式中,集合类和客户端都依赖于抽象迭代器接口,而不是依赖于具体迭代器类,倒转了依赖关系。

4、组合复用原则(Composite Reuse Principle)

客户端可以统一使用迭代器接口遍历不同的集合类,复用迭代器提供的遍历功能。

5、里氏替换原则(Liskov Substitution Principle)

迭代器模式中,每个迭代器类都可以通过继承迭代器接口,替换基类迭代器角色。

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

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

相关文章

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、…

Android Framework岗位面试真题分享

Handler是Android中的消息处理机制&#xff0c;是一种线程间通信的解决方案&#xff0c;同时你也可以理解为它天然的为我们在主线程创建一个队列&#xff0c;队列中的消息顺序就是我们设置的延迟的时间&#xff0c;如果你想在Android中实现一个队列的功能&#xff0c;不妨第一时…

【UE】运行游戏时就获取鼠标控制

问题描述 我们经常在点击运行游戏后运行再在视口界面点击一下才能让游戏获取鼠标控制。其实只需做一个设置就可以在游戏运行后自动获取鼠标控制。 解决步骤 点击编辑器偏好设置 如下图&#xff0c;点击“播放”&#xff0c;再勾选“游戏获取鼠标控制” 这样当你运行游戏后直…

shardingsphere mybatisplus properties和yml配置实现

shardingsphere mybatisplus properties和yml配置实现 目录结构 model package com.oujiong.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date;/*** user表*/ TableName("user") Data public class Use…

开发工具VSCODE的使用记录

vscode简介 Visual Studio Code&#xff08;简称“VS Code” [1] &#xff09;是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代Web和云应用的跨平台源代码编辑器&#xff0c; [2] 可在桌面上运行…

python详解(8)——进阶(2):初步算法

目录 &#x1f3c6;一、前言 &#x1f3c6;二、时间复杂度 &#x1f3c6;三、递推 &#x1f6a9;1.简介 &#x1f6a9;2.爬楼梯 &#x1f6a9;3、猴子吃桃 &#x1f3c6;四、递归 &#x1f6a9;1、简介 &#x1f6a9;2、递归求斐波那契数列 &#x1f6a9;3、递归求阶乘 &#x…

“开放合作 共享未来”华秋联手伙伴共创硬件生态,助力物联网硬件加速创新

2023年7月11日&#xff0c;华秋携产品与方案亮相慕尼黑上海电子展&#xff08;electronica China&#xff09;&#xff0c;并与5家生态伙伴签署硬件生态共创战略协议&#xff0c;通过“硬件软件供应链”的合作模式&#xff0c;发挥各自行业优势&#xff0c;共同推动电子产业的创…

springboot时间管理系统

通过前面的功能分析可以将时间管理系统的功能分为管理员&#xff0c;用户两个部门&#xff0c;系统的主要功能包括首页&#xff0c;个人中心&#xff0c;系统公告管理&#xff0c;用户管理&#xff0c;时间分类管理&#xff0c;事件数据管理&#xff0c;目标数据管理&#xff0…

k8s 持久化存储

我们继续来查看 k8s 的卷&#xff0c;上一次我们分享了将磁盘挂载到容器中&#xff0c;empyDir 和 gitRepo 都是会随着 pod 的启动而创建&#xff0c;随着 pod 的删除而销毁 那么我们或许会有这样的需求&#xff0c;期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问…

uniapp下上传图片后图片裁剪加图片旋转,支持H5和app

效果图 代码如下 <template><view class"container" v-show"isShow"><view><view class"cropper-content"><view v-if"isShowImg" class"uni-corpper":style"width: cropperInitW px;he…

Docker 安装 Nacos 单节点

Docker 安装 Nacos 单节点 1 搜索 Nacos2 下载 Nacos3 安装 Nacos Nacos&#xff08;中文名“云注册中心和配置中心”&#xff09;是一个用于动态服务发现、配置管理和服务管理的开源项目&#xff0c;它由阿里巴巴集团开发并开源。Nacos提供了一种简单而强大的方式来实现微服务…

【力扣JavaScript】1047. 删除字符串中的所有相邻重复项

/*** param {string} s* return {string}*/ var removeDuplicates function(s) {let stack[];for(i of s){let prevstack.pop();if(prev!i){stack.push(prev);stack.push(i);}}return stack.join(); };