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

在这里插入图片描述

😄 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方法获取下一个商品。

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

迭代器模式优缺点

迭代器模式的优点:

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

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

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

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

迭代器模式的缺点:

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

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

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

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

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端 | (二)各种各样的常用标签 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML排版标签&#x1f4da;HTML语义化标签&#x1f4da;块级元素与行内元素&#x1f4da;文本标签&#x1f407;常用的文本标签&#x1f407;不常用的文本标…

高效又安全的企业大数据传输解决方案推荐

在当前的商业领域中&#xff0c;企业大数据传输是一个重要而复杂的问题。随着企业规模和数据量的扩大&#xff0c;如何安全可靠、高效快速地传输大数据成为了许多企业需要面对的挑战。本文将介绍几种值得考虑的企业大数据传输解决方案&#xff0c;以帮助企业有效应对这一挑战。…

Ubuntu22.04密码忘记怎么办 Ubuntu重置root密码方法

在Ubuntu 22.04 或其他更高版本上不小心忘记root或其他账户的密码怎么办&#xff1f; 首先uname -r查看当前系统正在使用的内核版本&#xff0c;记下来 前提&#xff1a;是你的本地电脑&#xff0c;有物理访问权限。其他如远程登录的不适用这套改密方法。 通过以下步骤&#…

OpenCV for Python 学习第五天:图片属性的获取

上一篇博文当中&#xff0c;我们学习了如何获取图片的通道&#xff0c;我们了解了通道的分离方法split()和通道的组合方法merge()。那么我们今天就来对图片的属性做一个深入的了解。 文章目录 图片属性OpenCV中属性介绍图片属性的获取 图片属性 图片属性是指描述和定义一张图片…

Android 网络游戏开发入门简单示例

在Android系统上开发是Android开发学习者所向往的&#xff0c;有成就感也有乐趣&#xff0c;还能取得经济上的报酬。那怎样开发Android网络游戏攻略呢&#xff1f;下面介绍一个简单的入门实例。 一、创建新工程   首先&#xff0c;我们在Eclipse中新建一个名为Movement的工程…

套餐管理模块开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(六)

文章目录 前言一、新增套餐1. 需求分析2. 数据模型3. 代码开发4. 功能测试 二、套餐信息分页查询1. 需求分析2. 代码开发3. 功能测试 三、删除套餐1. 需求分析2. 代码开发3. 功能测试 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#x…

C# 深入理解事件(event)机制

目录 一&#xff0c;引言 二&#xff0c;事件的定义和用法 2.1 同步事件执行 2.2 异步事件执行 2.3 等待异步事件完成 2.4 捕获异常处理中的异常 一&#xff0c;引言 都知道事件的本质是一个多播委托&#xff08;MulticastDelegate)&#xff0c;但对于事件的机制和用法…

S3C2440点亮LED(裸机开发)

文章目录 前言一、环境介绍一、GPIO介绍二、点亮开发板的LED1.预备动作2.led代码 总结 前言 本期和大家主要分享的是使用S3C2440开发板点亮一个LED灯&#xff0c;可能大家拿到开发板之后做的第一件事情都是点灯&#xff0c;这是为什么呢&#xff1f;因为点灯这件事情不仅能够检…

Visual Studio 向工程中添加现有文件夹

前言&#xff1a; 在创建C#类库&#xff08;dll&#xff09;工程后&#xff0c;需要把现有的C#文件添加进工程中 步骤1.将所有文件夹复制到工程中 步骤2. 点击这个图标&#xff0c;显示所有文件夹 工程目录下的所有文件夹都会被显示出来 选中需要添加的文件夹&#xff0c;右…

微信小程序下拉刷新获取数据和触底事件刷新实现

一、下拉刷新 1.json文件 说明&#xff1a;开启下拉刷新&#xff0c;然后设置窗口的背景色&#xff0c;方便观看。 "enablePullDownRefresh": true,"backgroundColor":"#FFC0CB" 2. js文件 说明&#xff1a;重新发起请求&#xff0c;并显示加…

在Redis主从系统中使用哨兵

一、什么是哨兵 Redis的哨兵&#xff08;Sentinel&#xff09;是Redis分布式系统中的一种特殊角色&#xff0c;用于监控和管理Redis主从复制架构中的主节点&#xff08;master&#xff09;和从节点&#xff08;slave&#xff09;。 哨兵的主要功能是确保Redis系统的高可用性。它…

vscode debug的方式

在.vscode文件夹下建立launch.json 例子1&#xff1a;调试python 来自 https://github.com/chunleili/tiPBD/tree/amg {"version": "0.2.0","configurations": [{"name": "hpbd 5 5","type": "python&quo…

26.JavaWeb-SpringSecurity安全框架

1.SpringSecurity安全框架 Spring Security是一个功能强大且灵活的安全框架&#xff0c;它专注于为Java应用程序提供身份验证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;和其他安全功能。Spring Security可以轻松地集成到Spring框架中…

极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析...

全文链接&#xff1a;http://tecdat.cn/?p24182 本文用 R 编程语言极值理论 (EVT) 以确定 10 只股票指数的风险价值&#xff08;和条件 VaR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 使用 Anderson-Darling 检验对 10 只股票的组合数据进行…

uniapp 小程序 联想地址搜索

效果图&#xff1a; qqmap-wx-jssdk.js下载 <template><view class"items"><view class"items-text">地址&#xff08;必填&#xff09;</view><input type"text" placeholder"搜索地址" maxlength&quo…

解决Missing cookie ‘JssionId‘ for method parameter of type String问题

错误描述如下所示&#xff1a; 上述错误是我在使用CookieValue注解&#xff0c;获取cookieID时出现的&#xff0c;错误原因是由于**CookieValue注解注解中的value值和浏览器中的cookie的jssionID不一致所导致的** 如下所示为浏览器中的CookieID的参数名 而我在注解中写的如下图…

自动化测试之数据驱动与关键字驱动

目录 1.录制/回放的神话 2.数据驱动的自动化测试框架 3.关键字驱动的自动化测试 初次接触自动化测试时&#xff0c;对数据驱动和关键字驱动不甚理解&#xff0c;觉得有点故弄玄须&#xff0c;不就是参数和函数其嘛&#xff01;其实其也体现了测试所不同与开发的一些特点&…

基于遗传算法的新能源电动汽车充电桩与路径选择MATLAB程序

主要内容&#xff1a; 根据城市间的距离&#xff0c;规划新能源汽车的行驶路径。要求行驶距离最短。 部分代码&#xff1a; %% 加载数据 %%遗传参数 load zby;%个城市坐标位置 NIND50; %种群大小 MAXGEN200; Pc0.9; %交叉概率 Pm0.2; %变异概率 GGAP0.…

postman 自动化测试

postman 自动化测试 0、写在前面1、变量引用1.1、如何在请求体中引用变量 2、变量设置2.1、测试需求场景描述&#xff1a;2.2、postman实战2.2.1、全局token的处理2.2.2、接口1的处理2.2.3、接口2的处理2.2.4、接口3的处理 3、测试结果展示 0、写在前面 在有些时候看官方文档 …

聚焦型光场相机基于立体视差的深度估计原理

聚焦型光场相机可以看作是主透镜将物面成了一个放大或者缩小的虚像&#xff0c;然后每个微透镜阵列对这个经过放大或者缩小的虚像进行二次成像后投影在了ccd平面&#xff0c;其中二次成像的过程可以比拟为一个虚拟阵列相机&#xff0c;利用MLA和主透镜的相关参数就可以以立体视…