GoF设计模式(十六) - 迭代器模式

C++——设计模式 面向对象的优点和缺点 面向对象的三大特点 设计模式的六大原则 单例模式(线程安全) 工厂方法模式 适配器模式 代理模式 观察者模式 策略模式 备忘录模式 模板模式 状态模式 责任链模式 装饰模式 命令模式 阅读详情

前言

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

模式所涉及的角色

  • 抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
  • 抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
  • 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
     

代码实现 

迭代器接口

public interface Iterator {
    /**
     * 获取第一元素
     * @return Object
     */
    Object first();

    /**
     * 获取下一个元素
     * @return Object
     */
    Object next();

    /**
     * 是否存在下一个
     * @return Object
     */
    boolean hasNext();

    /**
     * 移除元素
     */
    void remove();

}

迭代器实现

public class ConcreteIterator implements Iterator{

    private List list = new ArrayList();
    private int cursor =0;

    public ConcreteIterator(List list){
        this.list = list;
    }

    @Override
    public Object first() {
        return this.list.get(0);
    }

    @Override
    public Object next() {
        Object obj = null;
        if(this.hasNext()){
            obj = this.list.get(cursor++);
        }
        return obj;

    }

    @Override
    public boolean hasNext() {
        return cursor != this.list.size();
    }

    @Override
    public void remove() {
        if (cursor == 0){
            this.list.remove(cursor);
            return;
        }
        this.list.remove(--cursor);
    }
}

 抽象容器

public interface Aggregate {
    /**
     * 添加
     * @param obj Object
     */
    void add(Object obj);

    /**
     * 删除
     * @param obj Object
     */
    void remove(Object obj);

    /**
     * 创建迭代器
     * @return Iterator
     */
    Iterator createIterator();

}

具体容器

public class ConcreteAggregate implements Aggregate{

    private List list = new ArrayList();

    @Override
    public void add(Object obj) {
        list.add(obj);
    }

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(list);
    }

    @Override
    public String toString() {
        return Arrays.toString(list.toArray());
    }
}

客户端

@Test
	void contextLoads() {
		Aggregate ag = new ConcreteAggregate();
		ag.add("张三");
		ag.add("李四");
		ag.add("王五");
		Iterator iterator = ag.createIterator();
		while(iterator.hasNext()){
			String str = (String)iterator.next();
			System.out.println(str);
		}

	}

	@Test
	public void contextLoads1(){
		Aggregate ag = new ConcreteAggregate();
		ag.add("张三");
		ag.add("李四");
		ag.add("王五");
		Iterator iterator = ag.createIterator();
		while(iterator.hasNext()){
			String str = (String)iterator.next();
			if ("王五".equals(str)){
				iterator.remove();
			}
		}
		System.out.println(ag);

	}

源码

https://download.youkuaiyun.com/download/javanbme/84992832

支付系统中的设计模式08:迭代器模式 用户下单购买的商品清单肯定是一个列表,而所谓的抽检其实就是要遍历这个列表中的每个元素,然后看看有无敏感商品或刷单行为(比如连续购买了多个同类的活动商品,并且下单时间极为接近,但这里不考虑这些)。最容易想到的方法就是直接用for循环检察列表,这的确是最直接的办法,但笔者还是要重复前面讲过的:在有了简单的、容易想到的办法后,至少还要再深入思考一下还有没有别的更好的方法可以替代呢? 阅读详情

相关推荐

北航机器学习期末考试试题2020年春

北航机器学习期末考试试题2020春 看csdn上试题收费,积分还挺高,本着共享的理念,把2020春季ML考试的试题公开,若侵权,立删 前8道题10分,第9题20分 决策树采用ID3算法 对宇宙星球是否适合生存分类 SVM的原理;软间隔、硬间隔;以及对非线性样本点分类 集成学习的原理,以及及串行boosting以及bagging的简单概括 K-means与混合高斯模型的异同以及EM算法的原理,如何计算 马尔可夫随机场最大团;马尔可夫随机场的联合概率分布(势函数表示),贝叶斯网络联合概率分布 PCA主成分基于

qq_43343919的博客 5417

迭代器模式

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。 类型:行为类模式 package 迭代器模式; import java.util.ArrayList; import java.util.List; /* 迭代器模式的结构: 抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。 具体容器...

qq_42727102的博客 195

告别重打包:在Android 9上实现免Root的Frida-Gadget持久化Hook(附AOSP源码修改详解)

本文详细介绍了在Android 9上实现免Root的Frida-Gadget持久化Hook技术方案。通过修改AOSP源码,绕过传统重打包方式面临的签名校验和完整性检查,实现在非Root环境下的系统级Hook。文章包含核心代码修改、编译配置调整及调试技巧,为移动安全研究提供高效稳定的解决方案。

weixin_33726313的博客 501

TreeSet

TreeSet 是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。 内部存储机制 TreeSet内部实现的是红黑树,默认整形排序是从小到大 与HashSet集合相比,TreeSet还提供了几个额外方法: Comparator comparator():如果TreeSet采用了定制顺序,则该方法返回定制排序所使用的Comparator,如果TreeSet采用自然排序,则返回null; Object first():返回集合中的第一个元素; Object last():返回集合中的

weixin_44547668的博客 433

多普勒频移测速与FMCW测距

文章目录时域与频域基于多普勒频移估计速度基于传统的FMCW测距什么是FMCWFMCW测距原理参考论文 时域与频域 时域 — 自变量是时间,即横轴是时间,纵轴是信号振幅的变化。表示振幅随时间的变化。 频域 — 自变量是频率,即横轴是频率,纵轴是该频率信号幅度的峰值。表示振幅峰值随频率的变化。 基于多普勒频移估计速度 当发送端静止而接收端相对运动时,有: v=FsFcv=\frac{F^s}{F}cv=FFs​c 其中,F是信号的原始频率;FsF^sFs 是接收信号频率与发送信号频率之差,即多普勒频移;c是

dsaaf21的博客 9187

Zabbix华为交换机光衰告警

zabbix使用自动发现监控huawei网络设备光衰

qq_31651649的博客 4529

详解设计模式:迭代器模式

迭代器模式(Iterator Pattern)也被称为游标模式(Cursor Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。是一种最简单也最常见的设计模式。 迭代器模式 可以让用户透过特定的接口巡访容器中的每一个元素而不用了解底层的实现。 本篇文章内容包括:关于迭代器模式、观察者模式 Demo、模版方法模式的应用(ArrayList/Iterator 中的迭代器模式)

栗筝i的博客 3841

焦距与视差的关系及其对深度估计的影响

焦距在立体视觉中的作用至关重要,它直接影响视差的大小,从而影响深度估计的精度。焦距越长,视差差异越大,物体的深度估计就越精确。这一关系使得焦距长的相机在一些需要高精度深度估计的应用场景中更加优越。了解焦距与视差的关系,对于优化相机配置和提升深度估计精度具有重要意义。在实践中,选择合适的焦距对于获得精确的深度信息至关重要,特别是在自动驾驶、虚拟现实、三维重建等领域,精确的深度估计能够提供更好的用户体验和技术支持。

计算机科学与技术专业学生的成长之路 1671

什么是一等对象 first-class object(第一类对象)?

Python 中什么是一等对象 first-class object(第一类对象)? 文章目录Python 中什么是一等对象 first-class object(第一类对象)?0. 参考资料1. 定义 0. 参考资料 1. 定义 闲话:很多资料把 first-class object 翻译成 “第一类对象”,我觉得还是翻译成 “一等对象” 比较好,因为它明显借用了英语中 “一等公民” f...

团子大圆帅的博客 6296

拉曼光谱入门:10.显微拉曼与共聚焦技术

本文系统阐述了显微拉曼光谱技术与共聚焦原理的融合机制,详细解析了从激光激发、针孔空间滤波到光谱采集的完整光路架构,阐明了共聚焦设计在提升三维空间分辨率、抑制荧光背景及实现微区无损层析方面的核心优势,并探讨了关键光学器件的性能边界与系统技术局限。

qq_53529450的博客 167

C# 零基础入门知识点汇总

本文属于C#零基础入门之百识百例系列目录文章。此系列文章已经完结,欢迎大家点击文中文章链接查看详情进行学习。

陈言必行 -- Unity游戏开发领域优质博主 5348

容器删除元素后迭代器失效_GoF设计模式(十六):Iterator Pattern 迭代器模式

在行为型设计模式中,Iterator Pattern 迭代器模式可以算是大家平常见的最多的、也是比较简单的一种设计模式了abstract.jpeg模式思想对于集合容器这类东西相信大家都不陌生,而且在日常开发中也是高频使用的。对于不同类型的集合容器而言,比如Set、List、Map等,数据元素在其中的存放方式可谓千差万别。此时如果直接遍历集合容器下的所有元素,显然需要开发者对集合容器的实现...

weixin_34392511的博客 93

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

java23种设计模式个人整理_GoF设计模式合集

1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子,下面是目录:基础设计模式概述UML基础创建型模式单例模式简单工厂模式(非GoF模式)工厂方法模式抽象工厂模式原型模式建造者模式结构型模式适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式行为型模式职责链模式命令模式解释器模式迭代器...

weixin_39669133的博客 105

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式(二十六)设计模式GOF23-汇总总结

• GOF23中设计模式一览表 创建型模式 结构型模式 行为型模式 简单工厂模式 抽象工厂模式 工厂方法模式 单例模式 建造者模式 原型模式 适配器模式 桥接模式 组合模式 装饰器模式 外观模式 享元模式 代理模式 责任链模式 解释器模式 模板方法模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 • 创建

奥迪的博客 142

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java第十六周

设计模式的分类:分布式编程模式,用户界面模式,数据模型模式三大类。 GoF设计模式的分类: 根据目的准则分类: 1. 创建型:creational 与对象的创建有关。 2. 结构型:Structural 处理类或对象之间的组合。 3. 行为型:behavioral 描述类或对象如何交互及如何分配职责。 创建型模式(创建对象实例) 1.抽象工厂模式 AbstractFactory:把相关零件组合成产品。 JDK中体现:(1)java.sql包 2.建造者模式

qq_34087202的博客 2342

设计模式(十六)迭代器模式 — 统一访问集合元素的方式,不暴露内部结构

迭代器模式是一种设计模式,用于在不暴露集合内部结构的前提下,提供统一的方式顺序访问集合元素。它通过分离集合对象的遍历行为与数据结构,实现客户端代码与具体集合实现的解耦。核心组件包括迭代器接口(定义遍历操作)和聚合接口(创建迭代器)。该模式支持多种遍历策略(正序、逆序、过滤等),允许同时维护多个遍历状态,广泛应用于Java集合框架、JavaScript可迭代对象、树结构遍历等场景。在测试和前端框架(如Vue/React的列表渲染)中,迭代器思想也起到重要作用,确保代码的封装性和可维护性。

ZHE|张恒的博客 622

23种GoF设计模式简要概述

设计模式主要分三个类型:创建型、结构型和行为型。  其中创建型有:      一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。     二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。      三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决

743

GOF23设计模式

二十三种设计模式 一、单例设计模式 饿汉式: 二、工厂设计模式 三、抽象工厂模式 四、建筑者模式 五、原型模式 六、适配器模式 七、桥接模式 八、装饰模式 九、组合模式 十、外观模式 十一、享元模式 十二、代理模式 十三、模版方法模式 十四、命令模式 十五、迭代器模式 十六、观察着模式 十七、中介者模式 十八、...

weixin_30663391的博客 92

设计模式学习清单

设计模式四境界、设计模式与武功招式、模式分类、模式比较、其他模式

山里来的鱼 1385

设计模式(十六)----- 迭代器模式(Iterator)----(JAVA版)

迭代器模式      迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 适用性 1.访问一个聚合对象的内容而无需暴露它的内部表示 2.支持对聚合对象的多种遍历 3.为遍历不同的聚合结构提供一个统一的接口(支持多态迭代) 参与者 1.Iterator

hfreeman2011的专栏 743

深入浅出设计模式【导语、内含23种设计模式和踩坑经验】

设计模式是软件工程中解决常见问题的可复用方案模板,能帮助开发者编写清晰、灵活、可维护的代码。本文将通过系列文章深入解析经典设计模式,包括单例、工厂方法、抽象工厂等,涵盖核心概念、适用场景、类图分析、实现方式及最佳实践。结合Java语言、开源框架和业务案例,旨在为开发者提供理论与实战结合的深度指南,提升系统设计能力。适合希望夯实基础或优化设计的中高级开发者参考。

NeoLshu的博客 971

设计模式(C++实现)(总)

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式乃一个程序员的内功修炼。 有很多关于设计模式的书籍,比如轻松易读的《大话设计模式》、最为经典的GoF的《设计模式》、国人的经典原创《道法自然》等,网上关于设计模式的资料也非常多,且内容全面。但关于设计模式的书籍和网上的资料使用C++代码来举例实现的并不多,例如G

huashuolin001的博客 1145

Caché 23种设计模式

Caché 23种设计模式 前章 Caché 程序员必须知道的七大原则 第一章 Caché 设计模式 简单工厂模式 第二章 Caché 设计模式 策略模式 第三章 Caché 设计模式 装饰者模式 第四章 Caché 设计模式 代理模式 第五章 Caché 设计模式 工厂方法 第六章 Caché 设计模式 原型模式 第七章 Caché 设计模式 模版方法模式 第八章 Caché 设计模式 外观模式...

yaoxin521123的博客 4403
上一篇: GoF设计模式(十五) - 观察者模式
下一篇: GoF设计模式(十七) - 责任链模式
让程序飞
博客等级 码龄10年 8831粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值