行为设计模式 - 迭代器设计模式

迭代器设计模式中的一种行为模式。迭代器模式用于提供遍历一组对象的标准方法。Iterator模式广泛用于Java Collection Framework。Iterator接口提供遍历集合的方法。

目录[ 隐藏 ]

  • 1迭代器设计模式

    • 1.1迭代器模式示例
    • 1.2迭代器设计模式重点
    • 1.3 JDK中的迭代器设计模式

迭代器设计模式

根据GoF,迭代器设计模式意图是:

提供一种访问聚合对象元素的方法,而不会暴露其基础表示。

迭代器模式不仅仅是遍历集合,我们可以根据我们的要求提供不同类型的迭代器。

迭代器设计模式通过集合隐藏实际的遍历实现,客户端程序只使用迭代器方法。

迭代器模式示例

让我们通过一个简单的例子来理解迭代器模式。假设我们有一个无线电信道列表,并且客户端程序希望逐个或基于信道类型遍历它们。例如,一些客户端程序仅对英语频道感兴趣并且想要仅处理它们,他们不想处理其他类型的频道。

因此,我们可以向客户端提供一组通道,让他们编写逻辑来遍历通道并决定是否处理它们。但是这个解决方案有很多问题,比如客户端必须提出遍历的逻辑。我们无法确保客户端逻辑是正确的。此外,如果客户端数量增加,那么维护将变得非常困难。

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

实现的第一部分是为我们的集合和迭代器接口定义合同。

ChannelTypeEnum.java


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

ChannelTypeEnum是java enum,它定义了所有不同类型的通道。

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;}}

Channel是一个简单的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接口定义了我们的集合类实现的契约。请注意,有添加和删除通道的方法,但没有返回通道列表的方法。ChannelCollection有一个返回遍历迭代器的方法。ChannelIterator接口定义了以下方法;

ChannelIterator.java


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

现在我们的基本接口和核心类已准备就绪,让我们继续执行集合类和迭代器。

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;}}

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


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

迭代器设计模式重点

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

JDK中的迭代器设计模式

我们都知道Collection框架Iterator是迭代器模式实现的最好例子,但是你知道java.util.Scanner该类也实现了Iterator接口。阅读这篇文章,了解Java Scanner Class。

这就是迭代器设计模式的全部内容,我希望它有用且易于理解。

转载来源:https://www.journaldev.com/1716/iterator-design-pattern-java

行为设计模式 - 迭代器设计模式相关推荐

  1. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

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

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  3. java设计模式迭代器模式_迭代器模式和Java

    java设计模式迭代器模式 大家好,在本文中,我们将检查Iterator Pattern . 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值. 根据&l ...

  4. Java中的迭代器设计模式–示例教程

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

  5. iOS设计模式 - 迭代器

    iOS设计模式 - 迭代器 原理图 说明 提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 源码 https://github.com/YouXianMing/iOS-Des ...

  6. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  7. 23种设计模式-迭代器模式《三国名将》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部 ...

  8. 迭代器设计模式(Iterator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

    概念 迭代器设计模式(Iterator Design Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象(如集合)的元素,而不需要暴露该对象的底层表示.迭代器模式可以帮助我们 ...

  9. 设计模式(35)-----设计模式阶段性总结(一句话概括一个模式)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

最新文章

  1. 独家 | Python处理海量数据集的三种方法
  2. 转换到 COFF 期间失败: 文件无效或损坏 解决方法
  3. 《算法导论》学习总结 — 2.第一章 第二章 第三章
  4. 基因分子生物学~强和弱化学键
  5. html语言的前景,html5就业前景
  6. C#三层架构第四课之DAL层
  7. sublime的Fatal pylint error: UnicodeDecodeError: 'ascii' codec can't decode byte 问题解决方案
  8. 在微信浏览器中 location.reload() 不刷新解决方案(直接调用方法)
  9. android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~
  10. Android快速开发框架XUtils
  11. php进度条如何计算,投票最后显示进度条的百分比怎么算
  12. 数据集蒸馏 by Matching Training Trajectories
  13. Dubbo学习总结(3)——Dubbo-Admin管理平台和Zookeeper注册中心的搭建
  14. 线段树之单点更新,区域求和
  15. LIRe提供的6种图像特征描述方法的评测
  16. 二级java题型及分值_计算机二级java考试内容
  17. 操作高通QXDM5,点击重置按钮出现报错
  18. 一款非常优秀的内存数据库——lmdb
  19. OpenLinux平台学习(参照Neoway N720/N75 系列产品)
  20. SQLMAP命令详解

热门文章

  1. Think in AngularJS :对比 jQuery 和 AngularJS 的不同思维模式
  2. 使用 jQuery Mobile 与 HTML5 开发 Web App (十四) —— jQuery Mobile 方法下
  3. QQ登录JS SDK教程,调用openapi接口
  4. Mysql之inner join,left join,right join详解
  5. 悟透JavaScript
  6. C++——OOP(Object-Oriented Programming) vs. GP(Generic Programming)
  7. LeetCode 453. Minimum Moves to Equal Array Elements
  8. IDEA—使用插件反编译jar包
  9. 使用c#对xml文件进行解析 功能演示 161483724
  10. 配置MyEclipse的版本为jdk1.7