设计模式之迭代器模式(十三)

news2024/12/29 11:50:48

目录

1. 背景

1.1 学院展示问题

1.2 迭代器模式概述

2. 迭代器模式

2.1 迭代器解决院校展示

2.2 迭代器模式在JDK ArrayList中的应用


1. 背景

1.1 学院展示问题

编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系
组成,一个学校有多个学院,一个学院有多个系。

之前在组合模式中就是用到这个例子,因为可以用树形来展示,可以用组合模式来解决问题。

也可以用迭代器模式。

1.2 迭代器模式概述

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

说明:

  • Iterator :迭代器接口,是系统提供,含有 hasNext, next, remove
  • Concretelterator:具体的迭代器类,管理迭代
  • Aggregate :一个统一的聚合接口,将客户端和具体聚合解耦
  • ConcretcAggreage:具体的聚合持有对象集合,并提供一个方法,返回一个迭代器,该迭代器可以正确遍历集合。

优点:

  • 迭代模式提供了一个统一的方法遍历对象,不用考虑聚合类型,统一方法遍历对象。
  • 提供了一种设计思想:单一职责原则,引起一个类变化的原因只有一个。在聚合类中,把管理对象的遍历对象分开,这样一来集合改变,只改变聚合类型,遍历方式改变,只影响迭代器。

2. 迭代器模式

2.1 迭代器解决院校展示

public class Department {
	private String name;
	private String desc;
	public Department(String name, String desc) {
		super();
		this.name = name;
		this.desc = desc;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
}
public class ComputerCollegeIterator implements Iterator {

	//这里我们需要Department 是以怎样的方式存放=>数组
	Department[] departments;
	int position = 0; //遍历的位置
	
	public ComputerCollegeIterator(Department[] departments) {
		this.departments = departments;
	}
	
	//判断是否还有下一个元素
	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		if(position >= departments.length || departments[position] == null) {
			return false;
		}else {
		
			return true;
		}
	}
	
	@Override
	public Object next() {
		// TODO Auto-generated method stub
		Department department = departments[position];
		position += 1;
		return department;
	
	//删除的方法,默认空实现
	public void remove() {
		
	}
}
public interface College {
	public String getName();
	//增加系的方法
	public void addDepartment(String name, String desc);
	//返回一个迭代器,遍历
	public Iterator  createIterator();
}


public class ComputerCollege implements College {

	Department[] departments;
	int numOfDepartment = 0 ;// 保存当前数组的对象个数
	
	public ComputerCollege() {
		departments = new Department[5];
		addDepartment("Java专业", " Java专业 ");
		addDepartment("PHP专业", " PHP专业 ");
		addDepartment("大数据专业", " 大数据专业 ");
		
	}
	
	@Override
	public String getName() {
		return "计算机学院";
	}

	@Override
	public void addDepartment(String name, String desc) {
		Department department = new Department(name, desc);
		departments[numOfDepartment] = department;
		numOfDepartment += 1;
	}

	@Override
	public Iterator createIterator() {
		return new ComputerCollegeIterator(departments);
	}

}
public class OutPutImpl {
	
	//学院集合
	List<College> collegeList;

	public OutPutImpl(List<College> collegeList) {
		this.collegeList = collegeList;
	}
	//遍历所有学院,然后调用printDepartment 输出各个学院的系
	public void printCollege() {
		//从collegeList 取出所有学院, Java 中的 List 已经实现Iterator
		Iterator<College> iterator = collegeList.iterator();
		while(iterator.hasNext()) {
			//取出一个学院
			College college = iterator.next();
			System.out.println("=== "+college.getName() +"=====" );
			printDepartment(college.createIterator()); //得到对应迭代器
		}
	}
	
	//输出 学院输出 系
	public void printDepartment(Iterator iterator) {
		while(iterator.hasNext()) {
			Department d = (Department)iterator.next();
			System.out.println(d.getName());
		}
	}
}
public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建学院
		List<College> collegeList = new ArrayList<College>();
		
		ComputerCollege computerCollege = new ComputerCollege();
		InfoCollege infoCollege = new InfoCollege();
		
		collegeList.add(computerCollege);
		//collegeList.add(infoCollege);
		
		OutPutImpl outPutImpl = new OutPutImpl(collegeList);
		outPutImpl.printCollege();
	}

}

2.2 迭代器模式在JDK ArrayList中的应用

  • 内部类ltr充当具体实现迭代器Iterator的类,作为ArrayList内部类
  • List就是充当了聚合接口,含有一个 iterator()方法,返回一个迭代器对象ArrayList是实现聚合接口List 的子类,实现了iterator()
  • lterator接口系统提供
  • 迭代器模式解决了不同集合(ArrayList ,LinkedList)统一遍历问题
     

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

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

相关文章

驱动——platform驱动总线三种匹配方式

三种platform驱动匹配方式代码案例以及现象 方式一&#xff1a;通过设置名字进行匹配 相关API简介&#xff1a; 1、platform_device的API ①分配对象 struct platform_device { const char *name;//用于进行匹配的名字 int id;//总线号 PLATFORM_DEVID_AUTO&#xff08;自…

Java基于springboot+vue的共享电动车管理系统 nodejs

随着在我国国民水平的提高&#xff0c;低碳环保的概念也深入人心&#xff0c;越来越多的人选择了绿色环保的出现方式&#xff0c;共享电动车更是为绿色出行提供了一个有利的保障。通过本人的调查研究发现&#xff0c;很多大学的共享电动车的管理还是用手工传统的方式在进行&…

谷歌翻译用不了的解决方案

1.上 https://ping.chinaz.com/ ping一下translate.google.cn 2.往下拉&#xff0c;根据自己所在地&#xff0c;例如广东深圳&#xff0c;则看看按照响应时间排序&#xff0c;找广东省内的。 3.把响应ip复制&#xff0c;并且本地ping一下看看响应时间 响应时间40ms还能接受 …

redis cluster如何添加和删除节点?

文章目录redis cluster如何增加和删除节点&#xff1f;背景说明添加节点添加 master 节点添加slave节点删除节点删除 master 节点删除slave节点redis cluster如何增加和删除节点&#xff1f; 背景说明 由于虚拟环境有限&#xff0c;目前所采用的集群方案是在 3 台机器去搭建 …

java项目_第166期ssm多人命题系统_java毕业设计_计算机毕业设计

java项目_第166期ssm多人命题系统_java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm多人命题系统》 1、该项目分为3个角色&#xff0c;管理员和、用户、教师。 用户角色可以浏览前台,包含功能有&#xff1a; 首页、学校公告、试题信息、论坛信息 用…

Thread的基本用法

目录 1.创建线程 2.1 继承Thread类,重写run方法 2.2 实现Runnable,重写run方法 2.3 使用匿名内部类继承Thread类,重写run方法 2.4 使用匿名内部类实现Runnable接口,重写run方法 2.5 使用lambda表达式 3.Thread类的构造方法 4.Thread类的常见属性的获取方法 5.线程方法的…

游戏开发28课 cocoscreator 渲染排序说明

渲染排序说明 2D 渲染节点排序 2D 渲染节点可分为在 Canvas 下的节点和不在 Canvas 下的节点两种&#xff1a; 在 Canvas 下的节点可参考下文 UI 节点排序 部分的内容。 不在 Canvas 下的节点&#xff0c;用户可选择通过 自定义材质 来开启深度检测实现和 3D 物体的遮挡显示…

面试中经常被问到的几个回溯问题

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;本篇文章是对最近复刷的回溯相关的算法题进行记录&#xff0c;方便复习使用。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;&#x1f44f;。 小威在此先感谢各位大佬啦~~&#x1…

马尔可夫预测案例分析

根据已经有数据进行预测的研究方法有很多&#xff0c;包括arima模型、指数平滑法、灰色预测等&#xff0c;本文针对马尔可夫预测进行阐述。比如研究中国移动&#xff0c;中国联通和中国电信三家运营商&#xff0c;他们的用户可以互相携号转网&#xff0c;已经当前3家运营商的市…

开发者友好的Linux常见命令整理

系统本身 uname -a # 查看内核/操作系统/CPU信息 cat /etc/redhat-release 查看服务器版本 cat /proc/cpuinfo # 查看CPU信息 hostname # 查看计算机名 lspci -tv # 列出所有PCI设备 lsusb -tv # 列出所有USB设备 lsmod # 列出加载的内核模块 env # 查看环境变量 查看…

领域驱动设计-领域建模

领域建模 领域建模是针对问题空间的战术求解的过程&#xff1a;观察真实世界的业务需求&#xff0c;对业务知识进行提炼和转换&#xff0c;排除技术因素对建模产生的影响&#xff0c;一切围绕着业务需求而来。同时满足未来的需求变更与产品维护 快速建模法&#xff1a;名次动…

通信原理技术复习重点知识

1.感知控制层通信的目的和特点&#xff1a; 目的&#xff1a;将各种传感设备&#xff08;数据采集设备以及相关的控制设备&#xff09;所感知的信息在较短的通信距离内传送到信息汇聚系统&#xff0c;并由该系统传送到网络传输层 特点&#xff1a;传输距离近&#xff0c;传输方…

使用 SAP WebIDE 将 SAP UI5 应用部署到 ABAP 系统时遇到的关于传输请求的错误

有朋友遇到一个在 webide 里部署 SAP UI5 应用到 ABAP Repository 里时出错的问题&#xff1a; 错误消息&#xff1a; Failed to get transports for the selected package. Request POST /webidedispatcher/destinations/LND500/sap/bc/adt/cts/transportchecks failed: Forbi…

【数学】仿射变换(续1)

在 这篇文章 中我介绍了椭圆中的圆幂定理。其中&#xff0c;椭圆中的“相交弦定理”为 PA⋅PBPC⋅PDrAB2rCD2\frac{PA\cdot PB}{PC \cdot PD}\frac{r_{AB}^2}{r_{CD}^2}PC⋅PDPA⋅PB​rCD2​rAB2​​ 本来以为它是从来见不到的东西 然而 请看此题&#xff1a; 以下给出两种常…

传奇登录器打不开的四种原因

最近很多传奇玩家或者GM都遇到了传奇登陆器打不开&#xff0c;没反应&#xff0c;提示无法访问指定设备等问题&#xff0c;导致很多游戏没有办法玩&#xff0c;让玩家心情沮丧&#xff0c;作为GM&#xff0c;那么就更伤心了&#xff0c;很多玩家进不来游戏&#xff0c;开服数千…

Vue3框架中路由的使用和局部刷新的功能(第十一课)

使用vue-router的步骤:p第一步&#xff1a;创建路由需要映射的组件&#xff08;打算显示的页面&#xff09;&#xff1b;p第二步&#xff1a;通过createRouter创建路由对象&#xff0c;并且传入routes和history模式&#xff1b;配置路由映射: 组件和路径映射关系的routes数组&a…

linux杀毒软件clamav安装

clamav 简介 ClamAV is an open source (GPLv2) anti-virus toolkit, designed especially for e-mail scanning on mail gateways. It provides a number of utilities including a flexible and scalable multi-threaded daemon, a command line scanner and advanced tool …

Git的基本使用

Git 1.Git基础知识 1.1Git简介 更新的历史保存在Gitee中不会丢失的。 1.简介&#xff1a;Git是一个分布式版本管理系统&#xff0c;是为了更好地管理Linux内核开发而创立的。 Git可以在任何时间点&#xff0c;把文档的状态作为更新记录保存起来。因此可以把编辑过的文档复…

AI强势入场,成就史上最快足球

众所周知&#xff0c;卡塔尔是全球最富裕的国度之一&#xff0c;是世界第一大液化天然气生成和出口国。丰富的石油资源&#xff0c;几乎让每一名原住民从出生之日起就实现财务自由&#xff0c;人均GDP高达6万多美元&#xff0c;钞能力毋庸置疑。 2022年世界杯正是在这片富饶的土…

图论 - 拓扑排序

有向图的拓扑序列 给定一个 nnn 个点 mmm 条边的有向图&#xff0c;点的编号是 111 到 nnn&#xff0c;图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列&#xff0c;如果拓扑序列不存在&#xff0c;则输出 −1。 若一个由图中所有点构成的序列 AAA 满足&#xf…