18-Java迭代器模式 ( Iterator Pattern )

Java迭代器模式

    • 摘要
    • 实现
    • 范例

  • 迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示

  • 迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式

  • 迭代器模式属于行为型模式

摘要

1. 意图

  • 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示

2. 主要解决

  • 不同的方式来遍历整个整合对象

3. 何时使用

  • 遍历一个聚合对象

4. 如何解决

  • 把在元素之间游走的责任交给迭代器,而不是聚合对象

5. 关键代码

  • 定义接口:hasNext, next

6. 应用实例

  • JAVA 中的 iterator

7. 优点

  • 它支持以不同的方式遍历一个聚合对象;
  • 迭代器简化了聚合类;
  • 在同一个聚合上可以有多个遍历;
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码;

8. 缺点

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性

9. 使用场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示;
  • 需要为聚合对象提供多种遍历方式;
  • 为遍历不同的聚合结构提供一个统一的接口;

10. 注意事项

  • 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据

实现

在这里插入图片描述

  1. 定义一个叙述导航方法的Iterator接口和一个返回迭代器的Container接口;
  2. 实现了Container接口的实体类将负责实现Iterator接口;
  3. IteratorPatternDemo使用实体类NamesRepository来打印NamesRepository中存储为集合的Names;

范例

1. 创建接口

Iterator.java

package com.demo.gof;
public interface Iterator {
   public boolean hasNext();
   public Object next();
}

Container.java

package com.demo.gof;
public interface Container {
   public Iterator getIterator();
}

2. 创建实现了 Container 接口的实体类

该类有实现了 Iterator 接口的内部类 NameIterator

NameRepository.java

package com.demo.gof;
public class NameRepository implements Container {
   public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};

   @Override
   public Iterator getIterator() {
      return new NameIterator();
   }

   private class NameIterator implements Iterator {

      int index;

      @Override
      public boolean hasNext() {
         if(index < names.length){
            return true;
         }
         return false;
      }

      @Override
      public Object next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }     
   }
}

3. 使用 NameRepository 来获取迭代器,并打印名字

IteratorPatternDemo.java

package com.demo.gof;
public class IteratorPatternDemo {

   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();

      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      }     
   }
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/IteratorPatternDemo.java
$ java  com.demo.gof.IteratorPatternDemo
Name : Robert
Name : John
Name : Julie
Name : Lora

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

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

相关文章

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

国内鞋服品牌如何打造出优衣库的“零库存”运营体系

优衣库&#xff0c;作为全球知名的服装品牌&#xff0c;以其独特的“零库存”运营体系在业界树立了标杆。对于国内鞋服品牌而言&#xff0c;如何借鉴并打造类似的“零库存”运营体系&#xff0c;不仅是提升竞争力的关键&#xff0c;也是实现可持续发展的必然选择。本文将探讨国…

springboot实现多线程开发(使用@Async注解,简单易上手)

根据springboot的核心思想便捷开发&#xff0c;使用多线程也变得简单起来&#xff0c;通过一下几个步骤即可实现。 核心注解 EnableAsync将此注解加在启动类上&#xff0c;使项目支持多线程。 Async 使用我们的Async注解在所需要进行多线程的类上即可实现。 配置线程池 …

2024/3/7—2575. 找出字符串的可整除数组

代码实现&#xff1a; int* divisibilityArray(char *word, int m, int *returnSize) {int n strlen(word);int *res (int*)malloc(sizeof(int) * n);long cur 0;for (int i 0; i < n; i) {cur (cur * 10 (word[i] - 0)) % m;res[i] (cur 0) ? 1 : 0;}*returnSize …

1.BOM-获取元素(获取元素、修改属性)

web Api基本认知 作用&#xff1a;通过JS去操作html页面和浏览器(实现浏览器中的某些功能) 分类&#xff1a; DOM(网页)&#xff1a;Document Object Model(文档对象模型) BOM(浏览器)&#xff1a;Borwser Object Model(浏览器对象模型) DOM DOM树 将网页中标签的关系以树状…

[c++] c++ 中的顺序(构造,析构,初始化列表,继承)

对象构造的时候&#xff0c;对象成员变量的初始化顺序是什么样的 &#xff1f; 派生类构造的时候&#xff0c;先构造基类还是先构造派生类 &#xff1f; 构造函数中的初始化列表&#xff0c;初始化的顺序是列表的顺序吗 &#xff1f; 析构的时候&#xff0c;析构的顺序是什么…

评估需求优先级的方法

Kano模型&#xff1a; 1.前言 在大量的需求需要进行迭代时&#xff0c;由于时间、人力、财力等相关因素干扰&#xff0c;无法在有限的时间内容对所有的需求进行满足&#xff0c;此时需要我们对需求进行优先级的排列。最大化的合理的提高有限资源的使用。 在常见的产品优先级…

vcomp140.dll丢失如何修复,5种修复方法轻松搞定vcomp140.dll问题

vcomp140.dll文件的丢失可能会引发一系列系统运行与软件功能上的问题。具体来说&#xff0c;这个动态链接库文件是Visual C Redistributable的一部分&#xff0c;对于许多基于此环境开发的应用程序至关重要。一旦缺失&#xff0c;可能会导致部分应用程序无法正常启动或运行&…

代码随想录训练营第39天 | LeetCode 62.不同路径、​​​​​​LeetCode 63. 不同路径 II

LeetCode 62.不同路径 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 思路 代码如下&#xff1a; ​​​​​​LeetCode 63. 不同路径 II 文章讲解…

Java定时调度

在Java应用程序中&#xff0c;定时调度是一项重要的任务。它允许你安排代码执行的时间&#xff0c;以便在将来的某个时刻自动执行任务。Java提供了多种方式来实现定时调度&#xff0c;其中最常用的是Java的Timer和ScheduledExecutorService。 在本教程中&#xff0c;我们将学习…

基于C/S架构的在线阅读器

项目简介 本项目实现了用户的基本阅读功能。项目内容涉及到IO&#xff0c;网络编程&#xff0c;C&#xff0c;QT等知识点。本次项目服务器搭建在ubuntu上&#xff0c;客户端ui在QT中实现&#xff0c;客户端和服务器使用套接字通信。 一、基本功能展示 &#xff08;1&#xff…

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说&#xff0c;缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏&#xff0c;也因此导致了开发效率的骤降。这也使得例如libevent这类事件库&#xff08;基础组件库&#xff09;一时间大红大紫。 今天&#xff0c;码哥给大家带来一款基础库&#…

【开源物联网平台】FastBee认证方式和MQTT主题设计

&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy&#xff0c;然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因&#xff0c;而且Unity把Samples这个…

自动化测试框架、Python面向对象以及POM设计模型简介

1 自动化测试框架概述 所谓的框架其实就是一个解决问题的思维&#xff0c;前言中描述的诸多问题如果得到解决&#xff0c;自然而然这种得到良好解决的东西它就可以称之为一个框架&#xff0c;只是这个框架用来解决如何组织开展自动化测试。一个典型的自动化测试框架一般包括测…

市场复盘总结 20240307

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 89% 最常用的…

[OpenCv]频域处理

目录 前言 一、频域变换 1.傅里叶变换 2.代码实现 二、频域中图像处理 1.理解数字图片的频谱 2.频域图像处理步骤 3.使用低通滤波器实现图像平滑 4.使用高通滤波器实现图像锐化 三、总结 前言 数字图像处理的方法有两大类&#xff1a;一种是空间域处理法&#xff0c;…

【笔记】Android Telephony 漫游SPN显示定制(Roaming Alpha Tag)

一、功能名词简介和显示规则 Alpha Tag&#xff1a;运营商名称标识符&#xff0c;也是用于标识运营商的一个名称。客户需求描述常用名词&#xff0c;对开发而言都是SPN/PLMN功能模块的内容&#xff0c;状态栏左上角的运营商名称显示。 SPN相关文章&#xff1a; 【笔记】SPN和…

nyist_acm 个人积分赛1(部分题解会补充)

Mirrored String II 看到题解说是马拉车算法&#xff0c;我赛时并没想到&#xff08;好吧其实我是比赛完才知道有马拉车这个算法&#xff09; 因为字符串的长度只有1000&#xff0c;直接暴力跑其实就可以了&#xff0c;但是要注意的是&#xff1b;回文串有俩种形式&#xff0c…