津津乐道设计模式 - 迭代器模式详解(以购物车的场景来演示迭代器模式)

news2024/12/23 13:15:35

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 迭代器模式详解

  • 什么是迭代器模式
  • 迭代器模式适用场景
  • 代码案例
  • 迭代器模式优缺点
  • 结语

什么是迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问容器对象中各个元素的方法,而无需暴露容器的内部结构。迭代器模式将遍历元素和访问元素的责任分离,使得代码更加简洁、灵活,并且符合开闭原则。

迭代器模式的核心思想是将容器对象的遍历操作封装在一个迭代器对象中,迭代器对象负责维护当前遍历的位置,并提供一系列方法来访问容器中的元素。这样,客户端可以通过迭代器对象来逐个访问容器中的元素,而不需要关心容器的具体实现细节。

迭代器模式适用场景

迭代器模式适用于以下场景:

  • 需要遍历一个聚合对象(如列表、集合等)中的元素,但又不想暴露聚合对象的内部结构

  • 需要对聚合对象提供多种不同的遍历方式

  • 希望统一遍历不同聚合对象的接口

  • 希望通过迭代器来封装对聚合对象的遍历,以简化客户端代码

迭代器模式可以提供一种统一的遍历方式,使得客户端代码与具体的聚合对象解耦,增加了代码的灵活性和可扩展性。它适用于需要遍历聚合对象中的元素,但不希望暴露聚合对象内部结构的情况。

代码案例

在JAVA开发中最常见的就是使用JDK自带的Iterator 遍历集合,也正是因为很多语言都把都将迭代器作为一个基础的类库直接提供出来了,我们可以直接使用。当然理解原理才能帮助我们更好的使用这些工具类

下面我们以一个购物车的场景来演示迭代器模式

在这里插入图片描述
假设我们现在有一个购物车,其中存放着各种商品。现在我们需要遍历购物车中的商品,并对它们进行一些操作,比如计算总价、查找特定商品等。这时,我们可以使用迭代器模式来实现这个场景。

首先,我们定义一个商品类(Product)作为聚合对象中的元素:

// 商品类
class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

然后,我们定义一个迭代器接口(Iterator),其中包含了遍历商品和访问商品的方法:

// 迭代器接口
interface Iterator {
    boolean hasNext();
    Product next();
}

接下来,我们定义购物车类(ShoppingCart)作为聚合对象,实现迭代器接口,并提供一些方法来管理商品:

// 购物车类
class ShoppingCart implements Iterator {
    private List<Product> products;
    private int position;

    public ShoppingCart(List<Product> products) {
        this.products = products;
        this.position = 0;
    }

    @Override
    public boolean hasNext() {
        return position < products.size();
    }

    @Override
    public Product next() {
        if (hasNext()) {
            Product product = products.get(position);
            position++;
            return product;
        }
        return null;
    }
    // 其他购物车相关的方法...
}

现在,我们可以在客户端中使用购物车对象进行遍历和操作:

public class Client {
    public static void main(String[] args) {
        List<Product> products = new ArrayList<>();
        products.add(new Product("手机", 999.99));
        products.add(new Product("电视", 1999.99));
        products.add(new Product("耳机", 99.99));

        ShoppingCart shoppingCart = new ShoppingCart(products);

        while (shoppingCart.hasNext()) {
            Product product = shoppingCart.next();
            System.out.println("商品:" + product.getName() + ",价格:" + product.getPrice());
        }
    }
}

在上述代码中,我们通过创建购物车对象,并使用迭代器接口的方法来遍历购物车中的商品。通过迭代器的hasNext方法判断是否还有下一个商品,通过next方法获取下一个商品。

通过使用迭代器模式,我们将购物车的遍历操作封装在迭代器中,客户端代码与购物车的具体实现解耦,增加了代码的灵活性和可维护性。同时,我们可以通过扩展迭代器接口,实现不同的遍历方式,提供更多的灵活性和功能。

迭代器模式优缺点

迭代器模式的优点:

  • 简化了客户端代码:使用迭代器模式,客户端不需要关心聚合对象的内部结构,只需通过迭代器接口来遍历聚合对象的元素,简化了客户端代码。

  • 提供了多种遍历方式:通过定义不同的迭代器,可以实现多种不同的遍历方式,如正序遍历、逆序遍历等,增加了灵活性。

  • 封装了迭代器的实现:迭代器模式将迭代器的实现细节封装在聚合对象内部,客户端无需了解具体实现,使得聚合对象和迭代器对象的职责清晰分离。

  • 支持对聚合对象的并发遍历:某些特定的迭代器实现可以支持对聚合对象的并发遍历,提高了代码的并发性和性能。

迭代器模式的缺点:

  • 增加了类的数量:引入迭代器模式会增加迭代器接口和具体迭代器的实现类,可能会使得类的数量增多,增加了系统的复杂性。

  • 遍历过程中修改聚合对象可能导致问题:如果在迭代过程中修改了聚合对象的结构,可能会导致迭代器的行为不可预测,需要在使用迭代器时注意避免这种情况。

  • 迭代器模式适用于顺序访问的集合类型:如果聚合对象的内部结构发生变化,可能会导致迭代器的实现也需要相应修改。

迭代器模式适用于需要遍历聚合对象中的元素,并且希望将遍历操作和聚合对象的具体实现解耦的场景。在使用迭代器模式时需要权衡其优点和缺点,并根据具体场景来选择是否使用

结语

本章节主要介绍了迭代器模式、迭代器模式适用场景、迭代器模式的优缺点,并以购物车的场景来演示迭代器模式,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出更多优质的博文与大家一起分享交流~

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

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

相关文章

【C++】priority_queue使用与模拟实现

认识priority_queue 1、priority_queue(优先级队列)是一种容器适配器&#xff0c;底层是一个完全二叉树的大堆&#xff08;堆总是一颗完全二叉树&#xff0c;根结点最大的堆叫做大堆&#xff1b;根结点最小的堆叫做小堆&#xff09;&#xff0c;头文件在queue中&#xff0c;根…

simple RNN pytorch代码实现

simple RNN pytorch代码实现 在写这篇博客之前&#xff0c;博主要说一件事情&#xff0c;网上的simple RNN代码很多都是错误的&#xff0c;博主的也是错误的&#xff0c;为什么呢&#xff1f; 因为simple RNN的梯度下降代码必须自己去写&#xff0c;simple RNN的梯度下降不能使…

巧用浮动布局、解决高度塌陷实例分享

问题 如图所示&#xff0c;这种效果该怎么实现呢&#xff1f; 面包屑导航和按钮一行两端显示面包屑或编辑栏超出宽度则自动另行显示 实现 采用浮动&#xff0c;绿色块左浮&#xff0c;蓝色块右浮&#xff0c;利用浮动特性实现宽度超出另一行显示的效果&#xff0c;并是动态的…

ModaHub魔搭社区:什么是非结构化数据?

目录 概览 区分结构化、半结构化和非结构化数据 结构化数据示例 欢迎来到向量数据库 101 系列教程。 概览 这是向量数据库 101 系列教程第一课,主要向大家介绍一下非结构化数据。 现在我们每天都会产生新的数据,这无疑是全球一体化和全球经济的关键动力。从腕部佩戴的…

【NLP】国外新动态--LLM模型

一、说明 NLP走势如何&#xff1f;这是关于在实践中使用大型语言模型&#xff08;LLM&#xff09;的系列文章中的一篇文章。在这里&#xff0c;我将介绍LLM&#xff0c;并介绍使用它们的3个级别。未来的文章将探讨LLM的实际方面&#xff0c;例如如何使用OpenAI的公共API&#x…

面试题更新之-css中link和@import的区别

文章目录 导文link是什么&#xff1f;import是什么&#xff1f;css中link和import的区别 导文 面试题更新之-css中link和import的区别 link是什么&#xff1f; CSS Link是用于将外部CSS文件链接到HTML文档中的HTML标签。通过使用CSS Link标签&#xff0c;可以将外部的CSS样式表…

游戏测试与策划的那些事儿

作为一个游戏测试员&#xff0c;和程序、前端、策划之间的沟通交流在所难免。今天就来吐槽一下子啦~ 作为游戏测试的核心机密&#xff0c;可不能被他们知道我们在背后吐槽啦~ 游戏测试&#xff1a;XXX&#xff0c;刚测完这数据怎么和之前的不一样了&#xff1f; 策划&#xff1…

Python分布式任务队列Celery

一、分布式任务队列Celery介绍 Python celery是一个基于Python的分布式任务队列&#xff0c;主要用于任务的异步执行、定时调度和分布式处理。它采用了生产者/消费者模式&#xff0c;通过消息中间件实现多个工作者进程之间的协作。 Python celery的架构主要包括以下组件&…

new和不用new调用构造函数,有什么区别?

new和不用new的构造函数&#xff0c;有什么区别&#xff1f; 下面从有return和无return,如果在有return的情况下&#xff0c;return原始类型数据和return引用应用类型数据等几方面进行论述&#x1f44d;&#x1f44d;&#x1f44d; 区别1&#xff1a;当没有return时 functio…

Bus消息总线(在Spring Cloud整合Bus(idea19版本)

Bus消息总线 所谓消息总线Bus&#xff0c;即我们经常会使用MQ消息代理构建一个共用的Topic&#xff0c;通过这个Topic连接各个微服务实例,MQ广播的消息会被所有在注册中心的微服务实例监听和消费。换言之就是通过一个主题连接各个微服务&#xff0c;打通脉络 Spring Cloud Bus …

FastDDS 源码剖析:DataWriter分析

目录 DataWriter分析 DataWriter 类分析 DataWriterImpl 类分析 关键函数分析 DataWriter分析 DataWriter 类分析 DataWriter 类是 Fast DDS 库中的一个重要类&#xff0c;它用于实现 DDS&#xff08;Data Distribution Service&#xff09;发布-订阅通信模型中的数据写入…

Git #01 操作记录

本篇内容 0. 前期配置1. 仓库1.1 上传本地代码到远程仓库 0. 前期配置 请提前配置好 git 的全局用户名&#xff1a; # xin&#xff1a;账号名 $ git config --global user.name "xin" # xin163.com&#xff1a;账号绑定的邮箱地址 $ git config --global user.emai…

单片机能否替代PLC实现控制和自动化系统?

是的&#xff0c;单片机可以在某些情况下替代PLC&#xff0c;但在其他情况下可能并不适用。以下是对这个问题的详细解释&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 灵活性和可编程性&#xff1a;PLC相对于单片机来说更具有灵活性和可编…

DolphinScheduler minio(S3支持)开启资源中心

DolphinScheduler 如果是在3.0.5 及之前的版本&#xff0c;没办法支持 S3 的协议的 当你按照文档配置之后&#xff0c;运行启动之后&#xff0c;在master 和 worker 节点&#xff0c;都会出现 缺包的依赖问题。 那这个问题在什么版本修复了呢&#xff1f; 3.0.6... 那 3.0.6 …

每个前端开发者都应知道的10个实用网站

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

sprinboot企业客户信息反馈平台

企业客户信息反馈平台的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该平台的开发&#xff0c;实现了企业客户信息反馈管理的信息化&#xff0c;使用户体验到更优秀的企业客户信息反馈管理&#xff0c;管理员管理操作将更加方便&a…

canal番外篇-otter

前置知识点 主从复制binlogcanal正则dockerjava 前置工具 dockerotter-all 场景描述&#xff08;增量同步&#xff09; 目前项目中使用的是mysql5.5&#xff0c;计划升级为mysql8.1&#xff0c;版本跨度较大&#xff0c;市面上可靠工具选择较少。otter符合预期&#xff0c…

3Ds max入门教程:为男性角色创建服装T 恤

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 3ds Max 角色服装教程 在本 3ds Max 教程中&#xff0c;我们将为角色模型创建一个简单的 T 恤。我们提供了一个“human_figure.obj”文件供您导入模型。因此&#xff0c;本教程将重点介绍的是创建服装&…

【VTK】VTK 显示小球例子,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 关于更多此例子的资料&#xff0c;可以参考&#xff1a;【Visual Studio】在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK。 文章目录 版本环境VTKTest.…

【机器人模拟-01】使用URDF在中创建模拟移动机器人

一、说明 在本教程中,我将向您展示如何使用通用机器人描述格式 (URDF)(机器人建模的标准 ROS 格式)创建模拟移动机器人。 机器人专家喜欢在构建机器人之前对其进行模拟,以测试不同的算法。您可以想象,使用物理机器人犯错的成本可能很高(例如,将移动机器人高速…