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

Unity实现设计模式——迭代器模式

Unity实现设计模式——迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。

抽象迭代器(Iterator):定义了遍历聚合对象所需的方法,包括hashNext()和next()方法等,用于遍历聚合对象中的元素。
具体迭代器(Concrete Iterator):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
抽象聚合器(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体聚合器(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。

简单来说就是容器的种类我们不需要知道是什么(List,HasSet等)我们只要获取到迭代器就可以进行遍历。
下面使用两个例子来说明

1.抽象的例子

(一)Aggregate

抽象聚合器

    abstract class Aggregate{public abstract Iterator CreateIterator();}

(二)ConcreteAggregate

具体聚合器

    class ConcreteAggregate : Aggregate{private ArrayList _items = new ArrayList();public override Iterator CreateIterator(){return new ConcreteIterator(this);}// Gets item countpublic int Count{get { return _items.Count; }}// Indexerpublic object this[int index]{get { return _items[index]; }set { _items.Insert(index, value); }}}

(三)Iterator

抽象迭代器

    abstract class Iterator{public abstract object First();public abstract object Next();public abstract bool IsDone();public abstract object CurrentItem();}

(四)ConcreteIterator

具体迭代器

    class ConcreteIterator : Iterator{private ConcreteAggregate _aggregate;private int _current = 0;// Constructorpublic ConcreteIterator(ConcreteAggregate aggregate){this._aggregate = aggregate;}// Gets first iteration itempublic override object First(){return _aggregate[0];}// Gets next iteration itempublic override object Next(){object ret = null;if (_current < _aggregate.Count - 1){ret = _aggregate[++_current];}return ret;}// Gets current iteration itempublic override object CurrentItem(){return _aggregate[_current];}// Gets whether iterations are completepublic override bool IsDone(){return _current >= _aggregate.Count;}}

(五)测试

public class IteratorStructure : MonoBehaviour
{void Start ( ){ConcreteAggregate a = new ConcreteAggregate();a[0] = "Item A";a[1] = "Item B";a[2] = "Item C";a[3] = "Item D";// Create Iterator and provide aggregateIterator i = a.CreateIterator();Debug.Log("Iterating over collection:");object item = i.First();while (item != null){Debug.Log(item);item = i.Next();}}
}

2.现实例子

这里使用一个不同年代的歌曲集来进行演示

(一)SongInfo

歌曲信息

    public class SongInfo{public string songName { get; protected set; }public string bandName { get; protected set; }public int yearReleased { get; protected set; }public SongInfo(string songName, string bandName, int yearReleased){this.songName = songName;this.bandName = bandName;this.yearReleased = yearReleased;}public string ToStringEx(){return this.songName + " - " + this.bandName + " : " + this.yearReleased.ToString();}}

(二)SongIterator

抽象迭代器

    public interface SongIterator{IEnumerator GetIterator();}

(三)SongsOfThe70s

70年代歌曲,既是迭代器又是聚合器

    public class SongsOfThe70s : SongIterator{// here it is a listprotected List<SongInfo> bestSongs;public SongsOfThe70s(){bestSongs = new List<SongInfo>();}public void AddSong(string name, string artist, int year){SongInfo song = new SongInfo(name, artist, year);bestSongs.Add(song);}//about yeild return :http://www.jb51.net/article/54810.htm// heartpublic IEnumerator GetIterator(){foreach (SongInfo song in bestSongs)yield return song;yield break;}}

(四)SongsOfThe80s

80年代歌曲,既是迭代器又是聚合器

    public class SongsOfThe80s : SongIterator{// here we have an arrayprotected SongInfo[] bestSongs;public SongsOfThe80s(){bestSongs = new SongInfo[0];}public void AddSong(string name, string artist, int year){SongInfo song = new SongInfo(name, artist, year);// just for the sake of easyness of appending something we will convert the array to a listList<SongInfo> newSongs = new List<SongInfo>(bestSongs);// add a new elementnewSongs.Add(song);// and convert it back to an arraybestSongs = newSongs.ToArray();}// heartpublic IEnumerator GetIterator(){foreach (SongInfo song in bestSongs)yield return song;yield break;}}

(五)测试

    void Start(){// creating the collections and adding some songs:SongsOfThe70s song70s = new SongsOfThe70s();song70s.AddSong("song title", "song artist", 1974);song70s.AddSong("song title2", "song artist2", 1978);SongsOfThe80s song80s = new SongsOfThe80s();song80s.AddSong("song title 80s", "song artist 80s", 1985);song80s.AddSong("song title2 80s", "song artist2 80s", 1989);// because of the iterator pattern we can loop through both types// of collections the same simple way and don't have to bother// with what type of collection the object stores:IEnumerator songsOfThe70sIterator = song70s.GetIterator();while (songsOfThe70sIterator.MoveNext()){SongInfo info = (SongInfo)songsOfThe70sIterator.Current;Debug.Log("Song 70s: " + info.ToStringEx());}IEnumerator songsOfThe80sIterator = song80s.GetIterator();while (songsOfThe80sIterator.MoveNext()){SongInfo info = (SongInfo)songsOfThe80sIterator.Current;Debug.Log("Song 80s: " + info.ToStringEx());}}

相关文章:

Unity实现设计模式——迭代器模式

Unity实现设计模式——迭代器模式 迭代器模式是一种行为型设计模式&#xff0c;它提供了一种统一的方式来访问集合对象中的元素&#xff0c;而不是暴露集合内部的表示方式。简单地说&#xff0c;就是将遍历集合的责任封装到一个单独的对象中&#xff0c;我们可以按照特定的方式…...

【数据结构与算法】之“堆”介绍

目录 堆的基本存储 一、概念及其介绍 二、适用说明 三、结构图示 堆的 shift up 堆的 shift down 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 优化堆排序 索引堆及其优化 一、概念及其介绍 二、适用说明 三、结构图示 堆的基本存储 一、概念及其介…...

ncnn Fatal signal 11 (SIGSEGV) 使用GPU加速崩溃

如果你的报错堆栈中包含以下信息,其中的关键信息是 anon:dalvik-classes2.dex extracted in memory Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3c in tid 8619 (eplabv3plusncnn), pid 8619 () 2023-10-07 15:48:31.395 9793-9793 DEBUG …...

计算机考研 | 2018年 | 计算机组成原理真题

文章目录 【计算机组成原理2018年真题44题-15分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2018年真题45题-8分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2018年真题44题-15分】 某计算机采用页…...

用Configuration注解的方式写一个java过滤器的详细实例?

在Java中&#xff0c;可以使用Configuration注解和Spring框架来创建和配置过滤器。下面是一个详细的示例&#xff1a; 首先&#xff0c;创建一个实现javax.servlet.Filter接口的过滤器类&#xff0c;例如MyFilter&#xff1a; import javax.servlet.*; import java.io.IOExce…...

基于Springboot实现旧物置换网站平台演示【项目源码+论文说明】分享

基于Springboot实现旧物置换网站平台演示 摘要 随着时代在一步一步在进步&#xff0c;旧物也成人们的烦恼&#xff0c;许多平台网站都在推广自已的产品像天猫、咸鱼、京东。所以开发出一套关于旧物置换网站成为必需。旧物置换网站主要是借助计算机&#xff0c;通过对用户进行管…...

想要精通算法和SQL的成长之路 - 存在重复元素

想要精通算法和SQL的成长之路 - 存在重复元素 前言一. 存在重复元素II二. 存在重复元素III2.1 基于红黑树增删改查 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 存在重复元素II 原题链接 思路&#xff1a; 我们用HashSet存储元素&#xff0c;做到去重的效果。同时存储…...

使用华为eNSP组网试验⑸-访问控制

今天练习使用华为sNSP模拟网络设备上的访问控制&#xff0c;这样的操作我经常在华为的S7706、S5720、S5735或者H3C的S5500、S5130、S7706上进行&#xff0c;在网络设备上根据情况应用访问控制的策略是一个网管必须熟练的操作&#xff0c;只是在真机上操作一般比较谨慎&#xff…...

iPhone苹果手机闹钟智能跳过节假日怎么设置?

国内绝大多数的手机用户使用的操作系统只有三个&#xff0c;安卓、鸿蒙和苹果的ios。而iPhone苹果手机的忠实用户是非常多的&#xff0c;所以日积月累中用户数量也就非常庞大&#xff0c;并且相当一部分用户都是上班族。而工作忙碌的上班族因为事情比较多&#xff0c;为了避免自…...

TenDB Cluster 简介

文章目录 1.简介2.TSpider3.TenDB4.Tdbctl5.TenDB Cluster Operator参考文献 1.简介 TenDB Cluster 是腾讯游戏 CROS DBA 团队提供的 MySQL 分布式关系型数据库解决方案。主要特点包括&#xff1a;透明分库分表、高可用的 MySQL 集群服务&#xff0c;透明及在线的扩容及缩容&a…...

【刷题笔记10.6】LeetCode:翻转二叉树

LeetCode&#xff1a;翻转二叉树 一、题目描述 给你一颗二叉树的根节点root&#xff0c;翻转这颗二叉树&#xff0c;并返回其根节点。 二、分析 我们在做二叉树题目时候&#xff0c;第一想到的应该是用 递归 来解决。 仔细看下题目的 输入 和 输出&#xff0c;输出的左右…...

【高阶数据结构】图详解第一篇:图的基本概念及其存储结构(邻接矩阵和邻接表)

文章目录 1. 图的基本概念1.1 什么是图1.2 有向图和无向图1.3 完全图1.4 邻接顶点1.5 顶点的度1.6 路径1.7 路径长度1.8 简单路径与回路1.9 子图1.10 连通图1.11 强连通图1.12 生成树 2. 图的存储结构2.1 邻接矩阵2.2 邻接矩阵代码实现结构定义构造函数添加边打印图测试 2.3 邻…...

IPV4跟IPV6的区别

如今互联网快速发展ipv4已经满足不了现在的需求&#xff0c;那么这时候就需要用更大的地址空间来代替&#xff0c;这时候ipv6就可以满足这一需求&#xff0c;相比ipv4它有更大的地址空间可供使用。下面我将分享一下有何区别。 IPv4与IPv6之间的区别: 1、地址长度的区别:IPv4具…...

利用fitnesse实现api接口自动化测试

上午在园子里乱逛&#xff0c;看了不少小伙伴们分享的接口测试方面的知识&#xff0c;仔细想想&#xff0c;我做接口测试也有几个年头了&#xff0c;大家所叙述到的一些经验或多或少&#xff0c;我也曾遇到过&#xff0c;突然意识到知识的点滴积累是多么的重要&#xff0c;我记…...

【LeetCode】1154.一年中的第几天

题目描述&#xff1a; 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&#xff1a; 输入&#xff1a;date "2019-01-09" 输出&#xff1a;9 解释&#xff1a;给定日期是2019年的第九天。示…...

4.物联网射频识别,RFID开发【智能门禁项目】

补充&#xff1a;学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续&#xff0c;前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房&#xff0c;用IC 卡刷卡开门 客人过了入住时间后&#xff0c;卡自动失效&a…...

CompletableFuture 和 Future 的选择,以及CompletableFuture的用法

在 Java 编程中&#xff0c;异步编程是一种重要的技术&#xff0c;它允许你在执行长时间运行的任务时不会阻塞主线程。为了支持异步编程&#xff0c;Java 提供了 Future 和 CompletableFuture 这两个关键的类。在本文中&#xff0c;我们将比较它们的特点、优缺点以及使用场景。…...

美国第三大财产和意外险公司利宝保险集团利用 OpenText EnCase 取证收集技术控制法律风险和成本

美国第三大财产和意外险公司利宝保险集团利用 OpenText EnCase 取证收集技术控制法律风险和成本 利宝保险集团通过内部取证收集技术控制法律风险和成本。OpenText EnCase Information Assurance&#xff08;以前称为 EnCase eDiscovery&#xff09;使保险公司巨头能够自信高效地…...

打包报错JavaScript heap out of memory

npm run build 的时候出现了Reached heap limit Allocation failed - JavaScript heap out of memory&#xff0c;报错信息如下图所示。 奇怪的时候这个报错信息在本地不会出现&#xff0c;通过jekins在服务器打包部署的时候才会出现。于是进入服务器执行下面一句代码&#xff…...

Android Camera FW 里的requestId和frameId

安卓相机frameworks里面经常出现requestId和frameId&#xff0c;最近简单看了一下代码&#xff0c;发现相关流程还是很复杂的&#xff0c;总结来看requestId 就是上层&#xff08;java&#xff09;发送的repeating(capture)请求的id&#xff0c;是从0开始递增的。 这是CameraD…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...