设计模式使用场景实现示例及优缺点(行为型模式——迭代子模式)

迭代子模式(Iterator Pattern)

迭代子模式(Iterator Pattern)是一种常用的设计模式,属于行为型模式。它提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。

核心组件

  • Iterator(迭代器):提供一种方法访问聚合对象的元素,而不需要暴露该聚合对象的内部结构。
  • Aggregate(聚合):定义创建相应迭代器对象的接口。
  • ConcreteIterator(具体迭代器):实现迭代器接口,完成集合的遍历。
  • ConcreteAggregate(具体聚合):实现创建迭代器的接口,返回一个适合该聚合的迭代器。

适用场景

  1. 访问一个聚合对象的内容而无需暴露它的内部表示
    • 使用迭代器模式可以分离集合对象的遍历行为,抽象出一个迭代器来负责遍历的职责。
  2. 需要对聚合有多种方式遍历时
    • 迭代器模式可以实现多种遍历策略,甚至可以同时进行多个遍历。
  3. 为遍历不同的聚合结构提供一个统一的接口
    • 当聚合结构变化时,你只需要调整迭代器,而无需修改聚合对象。

实现实例

以书籍集合为例,我们创建一个书籍聚合和对应的迭代器:

聚合接口(Aggregate Interface)

此接口定义了一个创建迭代器的方法。任何实现了 Aggregate 接口的聚合类都必须提供这个方法,用于生成遍历自身元素的迭代器。

public interface Aggregate {Iterator createIterator();
}

这里的 createIterator() 方法返回一个 Iterator 类型的对象,这个对象用于遍历聚合中的元素。

具体聚合(Concrete Aggregate)

BookCollection 类实现了 Aggregate 接口,表明它是一个可以被遍历的聚合。它持有一个书籍列表(List),并提供方法来添加书籍和创建迭代器。

public class BookCollection implements Aggregate {private List<Book> books;public BookCollection() {this.books = new ArrayList<>();}public void addBook(Book book) {books.add(book);}public Iterator createIterator() {return new BookIterator(books);}
}

这个类不仅存储书籍数据,还通过 createIterator() 方法生成一个专门用于遍历书籍的 BookIterator 对象。

迭代器接口(Iterator Interface)

迭代器接口定义了遍历聚合对象所需的基本方法,如 hasNext()next()

public interface Iterator {boolean hasNext();Object next();
}
  • hasNext() 方法检查是否还有更多元素可遍历。
  • next() 方法返回聚合中的下一个元素。
具体迭代器(Concrete Iterator)

BookIterator 类实现了 Iterator 接口,专门用于遍历书籍列表。

public class BookIterator implements Iterator {private List<Book> books;private int index;public BookIterator(List<Book> books) {this.books = books;this.index = 0;}public boolean hasNext() {return index < books.size();}public Book next() {if (hasNext()) {return books.get(index++);}return null;}
}

这个类维护一个指向当前遍历位置的索引,并利用 hasNext()next() 方法逐个访问书籍列表中的书籍。

客户端代码(Client Code)

客户端代码演示了如何使用迭代子模式遍历书籍集合。

public class Client {public static void main(String[] args) {BookCollection collection = new BookCollection();collection.addBook(new Book("The Great Gatsby"));collection.addBook(new Book("War and Peace"));Iterator iterator = collection.createIterator();while (iterator.hasNext()) {Book book = (Book) iterator.next();System.out.println("Book: " + book.getName());}}
}

在这段代码中,客户端首先创建一个 BookCollection 对象,并添加一些书籍。然后,它通过调用 createIterator() 方法获取迭代器,并使用迭代器遍历所有书籍。

优缺点

优点
  1. 支持多种遍历方式
    • 迭代器模式可以让你在同一聚合上同时进行多种遍历,并且可以自定义遍历算法。
  2. 简化聚合接口
    • 聚合本身无需提供多种遍历方法,这简化了聚合的接口。
缺点
  1. 可能增加系统的复杂性
    • 引入了额外的类和接口,增加了系统的复杂性。

迭代子模式提供了一种有效的方式来独立于对象的实现,透明地访问聚合中的各个元素,适用于多种数据结构的遍历需求。

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

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

相关文章

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

在RHEL9.4上启用SFTP服务

FTP存在的不足&#xff1a; 明文传输 FTP传输的数据&#xff08;包括用户名、密码和文件内容&#xff09;都是明文的&#xff0c;这意味着数据可以被网络上的任何人截获并读取。没有内置的加密机制&#xff0c;容易受到中间人攻击。 被动模式下的端口问题 FTP的被动模式需要…

读人工智能全传12人工智能导致的问题1

1. 人工智能会导致什么问题 1.1. 人工智能是一门通用技术&#xff1a;它的应用仅仅受限于我们的想象 1.1.1. 所有的技术都可能产生意想不到的效果&#xff0c;未来几十年甚至几百年内都存在可能性 1.2. 所有的技术都可能被滥用 1.2.1. 我们的无名氏祖先率先用上了火&#x…

大型土木工程项目灾害防御规划与风险评估系统

灾害防御规划更新与维护机制 SELECT DISTINCT 地质灾害类型 FROM 地质灾害信息表;SELECT 地质灾害类型, COUNT(*) AS 发生次数, (COUNT(*) * 100.0 / (

React Native和Swift有什么区别

React Native和Swift在多个方面存在显著的区别&#xff0c;这些区别主要体现在它们的技术基础、应用场景、性能特点、开发效率以及社区支持等方面。 一、技术基础 React Native&#xff1a;是一个由Meta&#xff08;原Facebook&#xff09;开发的开源JavaScript框架&#xff…

编写商品列表和商品编辑和商品新增页面

addvue <template><!-- 传过来的id --> <!-- {{ $route.query.id }} --> <el-formref"FormRef"style"max-width: 600px":model"FormData":rule"rules"status-iconlabel-width"auto"class"demo-r…

Python面试题:在 Python 中,如何处理内存泄漏?

在 Python 中&#xff0c;尽管有垃圾收集器&#xff08;GC&#xff09;来自动管理内存&#xff0c;有时仍可能会出现内存泄漏。内存泄漏通常是由于程序中存在长时间保留不再需要的对象&#xff0c;导致这些对象不能被垃圾收集器回收。以下是处理内存泄漏的一些方法&#xff1a;…

Spring AOP 基础知识

1.背景 按照软件重构的思想&#xff0c;当多个类中存在相同的代码时&#xff0c;需要提取公共部分来消除代码坏味道。Java的继承机制允许用户在纵向上通过提取公共方法或者公共部分(模版方法方式)至父类中以消除代码重复问题&#xff1b;日志、访问控制、性能监测等重复的非业务…

Golang | Leetcode Golang题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; type MyQueue struct {inStack, outStack []int }func Constructor() MyQueue {return MyQueue{} }func (q *MyQueue) Push(x int) {q.inStack append(q.inStack, x) }func (q *MyQueue) in2out() {for len(q.inStack) > 0 {q.outStack…

【web】-sql注入-login

根据网址提示打开如图&#xff1a; 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database&#xff0c;尝试sql注入。 由于post,bp抓包如下&#xff1a; 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…

昇思25天学习打卡营第20天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成个性化音乐 实验简介 MusicGen是Meta AI提出的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量音乐。该模型基于Transformer结构&#xff0c;分为三个阶段&#xff1a;文本编码、音频token预测和音频解码。此实验将演示如何使用MindSpo…

十年期国债收益率

十年期国债收益率是指政府发行的、期限为十年的国债的年化收益率。它被广泛视为一个国家经济健康状况和未来经济前景的重要指标&#xff0c;同时也是金融市场中的一个重要基准利率。 下面我将详细解释十年期国债收益率的相关内容及其意义。 十年期国债收益率的意义 经济健康的…

搞定ES6同步与异步机制、async/await的使用以及Promise的使用!

文章目录 同步和异步async/awaitPromisePromise的概念 同步和异步 ​ 同步&#xff1a;代码按照编写顺序逐行执行&#xff0c;后续的代码必须等待当前正在执行的代码完成之后才能执行&#xff0c;当遇到耗时的操作&#xff08;如网络请求等&#xff09;时&#xff0c;主线程会…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

如何解决VMware 安装Windows10系统出现Time out EFI Network...

一、问题描述 使用VMware 17 安装windows10出现如下图所示Time out EFI Network… Windows10镜像为微软官方下载的ISO格式镜像&#xff1b; 二、问题分析 VMware 17 默认的固件类型是UEFI(E)&#xff0c;而微软官网下载的Windows10 ISO格式镜像不支持UEFI(E)&#xff0c;支…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构④ | 4.7

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.7 安全架构 4.7.1 安全威胁 4.7.2 定义与范围 4.7.3 整体架构设计 4.7.4 网络安全架构设计 4.7.5 数据库系统安…

C++基础语法:STL之迭代器

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 C基础:STL概述-CSDN博客 上一篇梳理了一些同STL有关的概念.同时对理解迭代器需要的类包含,内部类,链表等内容做了分析,这篇从<C Prime Plus> 6th Edition(以下称"本书")的P684,大标题16.4泛型编…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

Algorithms,最全的Python算法仓库!

学习编程、学习Python最好的方式就是练习&#xff0c;哪怕是新手&#xff0c;只要不断地敲代码输出&#xff0c;肯定会有神效。 Python的练手项目很多&#xff0c;特别是Github上&#xff0c;建议不管新手、老司机都去看看。 这里推荐给大家一个Gitthub上练习的项目&#xff…