java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

java设计模式迭代器模式

迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式。 Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法。 根据GoF,迭代器设计模式的意图是:

提供一种在不暴露其基础表示的情况下访问聚合对象的元素的方法。

迭代器模式不仅涉及遍历集合,我们还可以根据需求提供不同种类的迭代器。 迭代器模式通过集合隐藏了遍历的实际实现,而客户端程序仅使用迭代器方法。

让我们通过一个简单的例子来了解这种模式。 假设我们有一个广播频道列表,并且客户端程序要逐个或根据频道类型遍历它们,例如,某些客户端程序只对英语频道感兴趣,并且只想处理它们,而没有想要处理其他类型的渠道。

因此,我们可以向客户提供渠道的集合,让他们编写逻辑来遍历渠道并决定是否进行处理。 但是此解决方案存在很多问题,例如客户端必须提出遍历的逻辑。 我们无法确保客户端逻辑正确,并且如果客户端数量增加,则将很难维护。

在这里,我们可以使用Iterator模式,并根据通道类型提供迭代。 我们应该确保客户端程序只能通过迭代器访问频道列表。

实现的第一部分是为我们的collection和iterator接口定义协定。

ChannelTypeEnum.java

package com.journaldev.design.iterator;public enum ChannelTypeEnum {ENGLISH, HINDI, FRENCH, ALL;
}

ChannelTypeEnum是Java枚举 ,它定义所有不同类型的通道。

Channel.java

package com.journaldev.design.iterator;public class Channel {private double frequency;private ChannelTypeEnum TYPE;public Channel(double freq, ChannelTypeEnum type){this.frequency=freq;this.TYPE=type;}public double getFrequency() {return frequency;}public ChannelTypeEnum getTYPE() {return TYPE;}@Overridepublic String toString(){return "Frequency="+this.frequency+", Type="+this.TYPE;}}

通道是一个简单的POJO类,具有频率和通道类型属性。

ChannelCollection.java

package com.journaldev.design.iterator;public interface ChannelCollection {public void addChannel(Channel c);public void removeChannel(Channel c);public ChannelIterator iterator(ChannelTypeEnum type);}

ChannelCollection接口为我们的集合类实现定义合同。 请注意,有一些方法可以添加和删除通道,但是没有方法可以返回通道列表,而有一个方法可以返回遍历的迭代器。 ChannelIterator接口定义以下方法;

ChannelIterator.java

package com.journaldev.design.iterator;public interface ChannelIterator {public boolean hasNext();public Channel next();
}

现在我们的基本接口和核心类已经准备好,让我们继续实现collection类和迭代器。

ChannelCollectionImpl.java

package com.journaldev.design.iterator;import java.util.ArrayList;
import java.util.List;public class ChannelCollectionImpl implements ChannelCollection {private List<Channel> channelsList;public ChannelCollectionImpl() {channelsList = new ArrayList<>();}public void addChannel(Channel c) {this.channelsList.add(c);}public void removeChannel(Channel c) {this.channelsList.remove(c);}@Overridepublic ChannelIterator iterator(ChannelTypeEnum type) {return new ChannelIteratorImpl(type, this.channelsList);}private class ChannelIteratorImpl implements ChannelIterator {private ChannelTypeEnum type;private List<Channel> channels;private int position;public ChannelIteratorImpl(ChannelTypeEnum ty,List<Channel> channelsList) {this.type = ty;this.channels = channelsList;}@Overridepublic boolean hasNext() {while (position < channels.size()) {Channel c = channels.get(position);if (c.getTYPE().equals(type) || type.equals(ChannelTypeEnum.ALL)) {return true;} elseposition++;}return false;}@Overridepublic Channel next() {Channel c = channels.get(position);position++;return c;}}
}

注意迭代器接口的内部类实现,以便任何其他集合都不能使用该实现。 集合类也遵循相同的方法,并且它们都具有Iterator接口的内部类实现。

让我们编写一个简单的测试类,以使用我们的集合和迭代器根据类型遍历通道的集合。

IteratorPatternTest.java

package com.journaldev.design.iterator;public class IteratorPatternTest {public static void main(String[] args) {ChannelCollection channels = populateChannels();ChannelIterator baseIterator = channels.iterator(ChannelTypeEnum.ALL);while (baseIterator.hasNext()) {Channel c = baseIterator.next();System.out.println(c.toString());}System.out.println("******");// Channel Type IteratorChannelIterator englishIterator = channels.iterator(ChannelTypeEnum.ENGLISH);while (englishIterator.hasNext()) {Channel c = englishIterator.next();System.out.println(c.toString());}}private static ChannelCollection populateChannels() {ChannelCollection channels = new ChannelCollectionImpl();channels.addChannel(new Channel(98.5, ChannelTypeEnum.ENGLISH));channels.addChannel(new Channel(99.5, ChannelTypeEnum.HINDI));channels.addChannel(new Channel(100.5, ChannelTypeEnum.FRENCH));channels.addChannel(new Channel(101.5, ChannelTypeEnum.ENGLISH));channels.addChannel(new Channel(102.5, ChannelTypeEnum.HINDI));channels.addChannel(new Channel(103.5, ChannelTypeEnum.FRENCH));channels.addChannel(new Channel(104.5, ChannelTypeEnum.ENGLISH));channels.addChannel(new Channel(105.5, ChannelTypeEnum.HINDI));channels.addChannel(new Channel(106.5, ChannelTypeEnum.FRENCH));return channels;}}

当我运行上面的程序时,它会产生以下输出;

IteratorPatternTest.java

Frequency=98.5, Type=ENGLISH
Frequency=99.5, Type=HINDI
Frequency=100.5, Type=FRENCH
Frequency=101.5, Type=ENGLISH
Frequency=102.5, Type=HINDI
Frequency=103.5, Type=FRENCH
Frequency=104.5, Type=ENGLISH
Frequency=105.5, Type=HINDI
Frequency=106.5, Type=FRENCH
******
Frequency=98.5, Type=ENGLISH
Frequency=101.5, Type=ENGLISH
Frequency=104.5, Type=ENGLISH

重要事项

  • 当您想提供一种标准方法来迭代集合并从客户端程序中隐藏实现逻辑时,迭代器模式非常有用。
  • 迭代逻辑嵌入在集合本身中,它可以帮助客户端程序轻松地对其进行迭代。

JDK中的迭代器模式

我们都知道Collection框架Iterator是迭代器模式实现的最佳示例,但是您知道java.util.Scanner类也实现Iterator接口。 阅读这篇文章以了解Java扫描程序类。

这就是迭代器模式的全部内容,我希望它会有所帮助并且易于理解。

参考: Java中的迭代器设计模式– JCG合作伙伴 Pankaj Kumar在开发人员食谱博客上的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/iterator-design-pattern-in-java-example-tutorial.html

java设计模式迭代器模式

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

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

相关文章

【2021.02.09更新】数学常用基本公式

泰勒级数 条件不多说了&#xff0c;函数f(x)f(x)f(x)在点xx0x {x_0}xx0​出展开为 f(x0)f′(x0)(x−x0)f′′(x0)2!(x−x0)2⋯f(n)(x0)n!(x−x0)n⋯f({x_0}) f({x_0})(x - {x_0}) \frac{{f({x_0})}}{{2!}}{(x - {x_0})^2} \cdots \frac{{{f^{(n)}}({x_0})}}{{n!}}{(x - {…

服装商城电商-前端网页技术精美完整源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;服装电商 获取完整源码&#xff08;打开即可用&#xff09; 效果①主页首页 效果②登录页 效果③注册页 效果④结算结账页 效果⑤联系页 效果⑥找不到资源页 效果⑦商品列表页 效果⑧商品详情页 效果⑨心愿清单页 其余及源码详…

REST:使用Controller端点?

在一般的REST架构中&#xff0c;基本概念是资源。 在资源之后&#xff0c;下一步是为这些资源开发一个统一接口&#xff0c;这在HTTP领域通常意味着&#xff1a; 创建为POST 阅读就是GET 更新为PUT&#xff08;或部分更新为PATCH&#xff09; 删除已删除 在现实世界中&…

【2021.02.09更新】数字信号处理公式推导

卷积 h(t)⊗x(t)∫−∞∞h(τ)x(t−τ)dτh(t) \otimes x(t) \int_{ - \infty }^{ \infty } {h(\tau )x(t - \tau )d\tau }h(t)⊗x(t)∫−∞∞​h(τ)x(t−τ)dτ 令τut2\tau u \frac{t}{2}τu2t​&#xff0c;则 h(t)⊗x(t)∫−∞∞h(ut2)x(−ut2)duh(t) \otimes x(t) …

旅游展示网站-前端网页设计技术完整精美源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;旅游网站 获取完整源码&#xff08;打开即可用&#xff09; 效果①首页主页 效果②关于我们页 效果③提供的服务页 效果④我们的能力页 /*页面重置*/ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote…

【2021.01.01】人生中很重要的一个十年,差强人意

回顾整个2020年&#xff0c;是疯狂的一年&#xff0c;也是令人难忘的一年&#xff0c;对于我也是比较励志的一年&#xff0c;绝对是自己人生中的一个里程碑。完成了人生中最重要的一件大事&#xff0c;感谢有你一直陪着我&#xff0c;愿天下有情人终成眷属&#xff0c;最终走到…

数字信号处理实验一 系统响应及系统稳定性

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;响应及稳定…

BPSK调制下(2,1,3)、(2,1,6)卷积码与QC-LDPC码译码性能和抑制突发噪声性能对比(MATLAB实现)

欢迎同步关注公众号【逆向通信猿】 QC-LDPC码的原理及构造 通过准循环码方式构造低密度校验矩阵 H ⁡ \operatorname{H} H,基础校验矩阵采用 H b = [ 0 1

数字信号处理实验二 IIR数字滤波器设计及软件实现

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;iir滤波器 …

高级java开发_适用于高级Java开发人员的十大书籍

高级java开发Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说&#xff0c;其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是&#xff0c;高级Java书籍并不总是就在眼前&#xff0c;并非…

数字信号处理实验三 FIR数字滤波器设计与软件实现

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;fir滤波器 …

一种伪随机交织器的生成方法

欢迎同步关注公众号【逆向通信猿】 线性同余交织+m序列寄存器状态→伪随机交织 线性同余交织 A n + 1 ≡ a A n + c   m

[JDK 11] jcmd中的类加载器层次结构详细信息

自从在JavaOne 2012上听说 jcmd以来&#xff0c;我就一直是命令行诊断工具jcmd的 粉丝 。 从那时起&#xff0c;我已广泛使用此工具&#xff0c;并多次在此博客中发布过此工具&#xff1a; jcmd&#xff1a;一个可以全部统治的JDK命令行工具 确定活动的热点垃圾收集器 程序化…

无线定位技术实验一 TDOA-FDOA联合定位

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;联合定位 获…

QPSK信号调制之ASCII码

clear;close all;clc; sym_dec(32:126).; sym_bitde2bi(sym_dec,8,left-msb); sym_bitreshape(sym_bit.,1,[]); bits repmat(sym_bit,1,50).; % bit2 reshape(bits,2,[]).; Nlength(bits)/2;M4; pha_qpsk qammod(bits,M,InputType,bit,PlotConstellation,true); % 生成相位 …

无线定位技术实验二 TDOA最小二乘定位法

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;tdoa最小二…

高阶矩和高阶累积量的换算关系

累积量可以用矩表示为 c x ( I ) = ∑ ⋃ p = 1 q I p = I ( − 1 )

无线定位技术实验三 基于信号强度的位置指纹定位仿真

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;指纹定位 获…

远程声控系统(MATLAB代码见CSDN资源)

欢迎同步关注公众号【逆向通信猿】 远程声控系统技术报告 一、题目要求 实现一个远程声音控制系统。首先采集不同的语音指示信号,进行适当压缩;然后通过噪声信道实现远程传输,远端接收后再通过适当计算识别出是何指示,最后送入一个处于未知状态、但能控/能观的控制系统,…

信号处理系统综合设计-最小阶数的IIR数字高通滤波器

微信公众号&#xff1a;创享日记 发送&#xff1a;最小阶 获取完整报告&#xff08;含源代码程序结果分析&#xff09; 设计一个最小阶数的IIR数字高通滤波器&#xff0c;指标要求如下&#xff1a; 以小于1dB的衰减通过150Hz的分量&#xff1b;以至少40dB抑制100Hz的分量&…