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

设计模式_迭代器模式

迭代器模式

介绍

设计模式定义案例
迭代器模式行为型:关注对象与行为的分离
提供了一种统一的方式来访问多个不同的集合
两个集合:使用了不同的数据存储方式
学生 和 警察

查询显示出集合的内容 ,使用相同的代码
问题堆积在哪里解决办法
不同的存储方式

统一集合查询代码
1 统一出一个存储方式
2 设计一个查询基类来统一查询代码
3 每个集合提供
  1 统一存储方式,
  2 一个查询实现(接口迭代器的实现)

类图

代码

interface BaseIterator<T>

/// <summary>
/// 迭代器基类
/// </summary>
public interface BaseIterator<T>
{// 当前T Current();// 下一个bool MoveNext();// 重新开始void Reset();
}

IteratorPolice 

using System.Collections.Generic;public class IteratorPolice : BaseIterator<People>
{// 列表List<People> listPeople = null;// 下标int currentIndex = -1;  IteratorPolice() { }public IteratorPolice(List<People> list){listPeople = list;}public People Current(){if (null == listPeople)return null;if (listPeople.Count < currentIndex)return null;return listPeople[currentIndex];}public bool MoveNext(){if (null == listPeople)return false;if (listPeople.Count > ++currentIndex)return true;return false;}public void Reset(){currentIndex = -1;}
}

IteratorStudent 


using System.Collections.Generic;public class IteratorStudent : BaseIterator<People>
{// 列表List<People> listPeople = null;// 下标int currentIndex = -1;IteratorStudent() { }public IteratorStudent(List<People> list){listPeople = list;}public People Current(){if (null == listPeople)return null;if (listPeople.Count < currentIndex)return null;return listPeople[currentIndex];}public bool MoveNext(){if (null == listPeople)return false;if (listPeople.Count > ++currentIndex)return true;return false;}public void Reset(){currentIndex = -1;}}

People


public class People
{public string name;public int age;public bool married;
}

StudentList

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StudentList
{private List<People> list = new List<People>();private People[] studentList = new People[3];public StudentList(){People p1 = new People(){name = "WH",age = 15,married = false};studentList[0] = p1;People p2 = new People(){name = "QT",age = 16,married = false};studentList[1] = p2;People p3 = new People(){name = "YY",age = 15,married = false};studentList[2] = p3;for (int i = 0; i < studentList.Length; i++){list.Add(studentList[i]);}}public BaseIterator<People> GetIterator(){return new IteratorStudent(list);}
}

PoliceList


using System.Collections.Generic;public class PoliceList
{private List<People> list = new List<People>();public PoliceList(){People p1 = new People(){name = "WangQiang",age = 23,married = false};list.Add(p1);People p2 = new People(){name = "ZhangQiang",age = 30,married = true};list.Add(p2);People p3 = new People(){name = "LingQiang",age = 31,married = true};list.Add(p3);}public BaseIterator<People> GetIterator(){return new IteratorPolice(list); }
}

测试代码

using UnityEngine;public class TestDDQ : MonoBehaviour
{void Start(){{PoliceList pl = new PoliceList();BaseIterator<People> iterator = pl.GetIterator();while (iterator.MoveNext()){People p1 = iterator.Current();Debug.Log("姓名:" + p1.name + "   年龄:" + p1.age + "   是否结婚:" + p1.married + " ");}}Debug.Log("------------------------------------------------------------------");{StudentList pl = new StudentList();BaseIterator<People> iterator = pl.GetIterator();while (iterator.MoveNext()){People p1 = iterator.Current();Debug.Log("姓名:" + p1.name + "   年龄:" + p1.age + "   是否结婚:" + p1.married + " ");}}}
}

结果

总结

迭代器模式统一集合查询代码,以这个为目标进现优化总结出的一个经验。

还是为了更深刻的理解设计原理和优化手段。

相关文章:

设计模式_迭代器模式

迭代器模式 介绍 设计模式定义案例迭代器模式行为型&#xff1a;关注对象与行为的分离 提供了一种统一的方式来访问多个不同的集合两个集合&#xff1a;使用了不同的数据存储方式 学生 和 警察 查询显示出集合的内容 &#xff0c;使用相同的代码 问题堆积在哪里解决办法不同…...

【数据结构】:栈的实现

1 栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则 压栈…...

微前端一:技术选型

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 微前端架构具备以下几个核心价值&#xff1a; 1、技术栈无关 主框架不限制接入应用的技术栈&#xff0c;微应用具备完全自主权 2、独立开发、独立部署 微应用仓库独立&#xff0…...

FPGA project : flash_continue_write

本实验学习了通过spi通信协议&#xff0c;驱动flash&#xff1b;完成连续写操作。 连续写&#xff1a; 本质上还是页编程指令&#xff0c;两种连续写的方式&#xff1a; 1&#xff0c;每次只写1byte的数据。 2&#xff0c;每次写满1页数据&#xff0c;计算剩余数据够不够写…...

论文阅读:Rethinking Range View Representation for LiDAR Segmentation

来源ICCV2023 0、摘要 LiDAR分割对于自动驾驶感知至关重要。最近的趋势有利于基于点或体素的方法&#xff0c;因为它们通常产生比传统的距离视图表示更好的性能。在这项工作中&#xff0c;我们揭示了建立强大的距离视图模型的几个关键因素。我们观察到&#xff0c;“多对一”…...

本地配置免费的https咋做?

大家好这里是tony4geek。 今天和公司的小伙伴对接项目&#xff0c;因为涉及到https的权限调用。所以在服务器本地localhost 要配置https用来测试 。现在把过程中遇到的问题记录下来。 • 因为是测试用所以生成https的证书用免费的就可以了。 openssl req -x509 -nodes -days …...

微信小程序框架---详细教程

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 目录 1.框架 1.1响应的数据绑定 1.2.页面管理 1.3.基础组件 1.4.丰富的 API 2.视图层 View 2.1.介绍 …...

【LeetCode刷题(数组and排序)】:存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;nums [1,2…...

半导体产业链解析:晶圆厂、无晶圆厂与代工厂的比较与作用

半导体产业一直是全球科技发展的关键驱动力&#xff0c;在半导体产业中&#xff0c;晶圆厂、无晶圆厂公司和代工厂是三个重要的参与者。它们在产业环节、生产方式、经营模式和市场竞争等方面存在一些显著差异。本文将探讨半导体晶圆厂、无晶圆厂公司和代工厂之间的区别&#xf…...

Apipost一键压测已支持导入CSV文件

最近更新中Apipost对UI页面进行了一些调整&#xff0c;另外一键压测功能支持参数化&#xff01;本篇文章将详细介绍这些改动&#xff01; API调试页面的细节改动 在请求区填入请求参数或脚本时会有相应的标识 如在Query中填入多个参数时上方会展示数量 在预、后执行脚本中写…...

RabbitMQ的5种模式——再探RabbitMQ的模式,简单、工作,发布订阅(广播),路由、主题 页面分析

前言 RabbitMQ作为一款常用的消息中间件&#xff0c;在微服务项目中得到大量应用&#xff0c;其本身是微服务中的重点和难点&#xff0c;有不少概念我自己的也是一知半解&#xff0c;本系列博客尝试结合实际应用场景阐述RabbitMQ的应用&#xff0c;分析其为什么使用&#xff0…...

初识华为云数据库GaussDB for openGauss

01 前言 GaussDB是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000的扩展能力&#xff0c;PB级海量存储。同时拥有云上高可用&#xff0c;高可…...

深圳寄包裹到德国

深圳&#xff0c;作为全球最发达的城市之一&#xff0c;以其高效的物流服务在全球范围内享有盛名。如果你正在寻找一种方式将包裹从深圳寄送到德国&#xff0c;那么本文将为你提供详细的步骤和建议。 第一步&#xff1a;了解国际邮寄的基本信息 首先&#xff0c;你需要了解包裹…...

系统架构师备考倒计时22天(每日知识点)Redis篇

Redis篇 1.Redis与Memcache能力对比 工作MemCacheRedis数据类型简单 key/value 结构丰富的数据结构持久性不支持支持分布式存储客户端哈希分片/一致性哈希多种方式&#xff0c;主从、Sentinel、Cluster 等多线程支持支持支持(Redis5.0及以前版本不支持)内存管理私有内存池/内…...

现有库存(on-hand inventory),库存水平(inventory level),库存位置(inventory position)

库存管理中&#xff0c;这几个名词特别容易混&#xff0c;干脆写一篇博客总结下。 现有库存(on-hand inventory)&#xff0c;是指持有的真实库存量 库存水平(inventory level)&#xff0c;现有库存减去延迟交付的订单 inventory level on-hand inventory − backorder quant…...

智慧空开让用电更安全、管理更智能——电脑APP远程控制开合闸

安科瑞 崔丽洁 01 什么是低压断路器&#xff1f;低压断路器的定义是&#xff1a;能够接通、承载及分断正常电路条件下的电流&#xff0c;也能在规定的非正常电路条件&#xff08;过载、短路、特别是短路&#xff09;下接通、承载一定时间和分断电流的开关电器。 断路器的分类&…...

PyTorch 中张量运算广播

TLDR 右对齐&#xff0c;空补一&#xff0c;从左往右依维运算 [m] [x, y] [m x, m y] 正文 以如下 a b 两个 tensor 计算为例 a torch.tensor([[1],[2],[3], ]) b torch.tensor([[[1, 2, 3],],[[4, 5, 6],],[[7, 8, 9],], ]) # a.shape (3, 1) # b.shape (3, 1, 3)首先…...

Blender:使用立方体制作动漫头像

好久没水文章 排名都掉到1w外了 ~_~ 学习一下blender&#xff0c;看能不能学习一点曲面变形的思路 一些快捷键 ctrl 空格&#xff1a;区域最大化&#xff0c;就是全屏 ctrl alt 空格&#xff1a;也是区域最大化 shift b&#xff1a;框选区域然后最大化显示该范围 shift 空…...

【ppt技巧】ppt里的图片如何提取出来?

之前分享过如何将PPT文件导出成图片&#xff0c;今天继续分享PPT技巧&#xff0c;如何提取出PPT文件里面的图片。 首先&#xff0c;我们将PPT文件的后缀名&#xff0c;修改为rar&#xff0c;将文件改为压缩包文件 然后我们将压缩包文件进行解压 最好是以文件夹的形式解压出来…...

Python学习基础笔记七十三——调试程序

为什么要调试&#xff1f; 我们发现程序运行的结果和我们预期的不符。 程序运行的错误&#xff0c;我们通常叫做bug。 有两种类型的bug&#xff1a;语句错误和逻辑错误。 所谓语句错误&#xff0c;就是执行代码的时候&#xff0c;解释器就可以直接发现的代码错误&#xff0c…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...