设计模式之迭代器模式

2023-11-11

迭代器模式源于对容器的访问,比如java中的List、Map、数组等,我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法。如果我们将遍历的方法封装到容器中,那么对容器类来说就承担了过多的功能,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,如果我们不提供遍历方法而让使用者自己去实现,又会让容器的内部细节暴露无遗,正因于此,迭代器模式应运而生,在客户访问类与容器之间插入一个第三者——迭代器,很好地解决上面地弊端。


//迭代器接口类:负责定义、访问和遍历元素的接口
public interface Iterator<T> {

    //是否有下一个元素
    boolean hasNext();
    //返回当前位置的元素并将位置移至下一位
    T next();
}

import java.util.ArrayList;
import java.util.List;

public class ConcreteIterator<T> implements Iterator<T> {
    private List<T> list = new ArrayList<>();
    private int cursor = 0;

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

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

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


//容器接口
public interface Aggregate<T> {
    void add(T obj);

    void remove(T obj);

    Iterator<T> iterator();
}

import java.util.ArrayList;
import java.util.List;

public class ConcreteAggregate<T> implements Aggregate<T> {
    private List<T> list = new ArrayList<>();

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

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

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<>(list);
    }
}

public class Client {
    public static void main(String[] args) {
        Aggregate<String> a = new ConcreteAggregate<>();
        a.add("AAA");
        a.add("BBB");
        a.add("CCC");
        a.add("DDD");
        Iterator<String> i = a.iterator();
        while (i.hasNext()){
            System.out.println(i.next());
        }
    }
}

对于迭代器模式来说,其自身有点很明显也很单一,支持以不同的方式去遍历一个容器对象,弱化了容器类与遍历算法之间的关系,其缺点就是对类文件的增加。几乎每一种高级语言的容器都有相应的内置迭代器的实现,对于开发者来说,已经极少会去自己来实现迭代器了,因此,对于迭代器模式我们更多地是了解即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之迭代器模式 的相关文章

  • 如何在 Flutter 中为 Button 添加渐变?

    有没有办法改变ElevatedButton背景颜色渐变 如果没有一些小瑕疵或问题 例如缺少涟漪效应 不需要的边框 不尊重主题的内容 上述所有解决方案都无法真正发挥作用minWidth对于按钮 The 下面的解决方案没有上述问题 关键部分是使
  • Android ACTION_DATE_CHANGED 广播

    我有 Nexus S 当我在手机上手动更改日期时 ACTION DATE CHANGED 并不总是被广播 如果我将日期从 2014 年 2 月 13 日更改为 2014 年 2 月 14 日 我还没有获得 ACTION DATE CHANG
  • 使用 ArrayAdapter 的 ListView 中的按钮

    我有一个使用 POJO 类填充的 ArrayAdapter 列表视图由 2 个布局组成 1 代表菜单项 1 代表类别 带分隔符的列表视图很好 后来我尝试在每个菜单项行中添加一个按钮来编辑其中的详细信息 当我尝试获取单击按钮的行的位置时 我遇
  • Android Activity 和 Service 关系 - 暂停后、停止后

    假设创建了 Activity A 然后 A 启动了一个 Service S 并将其自身绑定到 S S 通知 A 更新 这将导致 A 的状态发生变化 Android 暂停或停止 A 后 A 和 S 会发生什么 例如 暂停 A 是否会自动解除它
  • Droid 3 上的列表视图背景为灰色

    我有一个带有自定义背景的列表框 它在黑色背景的两侧显示一条细白线 在我所有的测试手机 Galaxy Captivate Vibrant Nexus 1 G Tablet Archos 32 Droid 上运行良好 我刚买了一台 Droid
  • 如何设置上拉刷新SwipeRefreshLayout

    我看到很多 ListView 下拉刷新的库 但是当从上到下拉动时它们是工作的 但是从下到上拉动时我如何刷新 我可以用这个做吗滑动刷新布局 http developer android com reference android suppor
  • 为什么设置 MediaRecorder 时显示错误 IllegalStateException?

    我的代码设置 MediaRecorder 它显示行集质量错误 mMediaRecorder new MediaRecorder Step 1 Unlock and set camera to MediaRecorder mCamera st
  • Android Youtube API 可用吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有适用于 Android 的 YouTube API 吗 如果不是 除了通过网络浏览器之外 如何从 Yo
  • Android - 具有可序列化对象的 SharedPreferences

    我知道 SharedPreferences 有putString putFloat putLong putInt and putBoolean 但我需要存储一个类型的对象Serializable in SharedPreferences 我
  • android sqlite 如果不存在则创建表

    创建新表时遇到一点问题 当我使用 CREATE TABLE 命令时 我的新表按应有的方式形成 但是当我退出活动时 应用程序崩溃 并且我在 logcat 中得到一个表已存在 如果我使用 CREATE TABLE IF NOT EXISTS 则
  • Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像

    文件存在于sdcard image jpg我想创建我自己的应用程序 活动 按下按钮时 需要使用内置图像查看器显示存储在 SD 卡中的图像 按图像查看器中的后退按钮后 它应该返回到我正在运行的应用程序 需要一些帮助 您可以为此创建一个具有适当
  • 未调用内容提供商 query() (Android TV)

    据报道 我正在尝试将我的应用程序纳入 Android TV 全局搜索中文档 http developer android com training tv discovery searchable html我必须创建以下内容 内容提供商 可搜
  • 上次更新arm64-v8a后,模拟器在M1 Mac上显示离线

    昨天模拟器运行得很好 系统镜像为arm64 v8a 我不太记得工作系统映像的版本名称 但是昨天我接受了 ARM 64 系统映像的更新 版本名称是 S 我可以从 AVD 管理器启动模拟器 当我按 运行应用程序 按钮时模拟器也会启动 但是 该应
  • 如何为工具栏上的溢出菜单中的菜单项设置字体

    我想更改项目的默认字体溢出菜单并设置自定义字体 我尝试添加一个工厂LayoutInflater并在onCreateView 方法我改变了TextView的字体 但这没有用 这是代码 在 onCreateOptionsMenu 内 getLa
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • Activity 上的 OnTouchListener 从不调用

    我使用了这段代码 但是当我在运行时单击活动时 它永远不会在 OnTouch 方法中命中 有人可以指导我我做错了什么吗 我需要设置此活动的内容视图吗 实际上我想要用户在执行过程中触摸的活动的坐标 public class TouchTestA
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 我的 apk 文件在模拟器中的位置

    我在 eclipse android 中编写了一个小程序 现在我安装并运行我的程序 它是一个 apk 现在我想知道我的 apk 文件在哪里 我什至想将它 拉 到我的系统中 是否可以 如果是这样请帮助我 如果您只想将 apk 安装在手机或类似
  • 更改 Android 中突出显示文本的颜色

    我不确定这是否可能 也许有人可以纠正我 我在 Android 应用程序中有一个 EditText 视图 该视图在蓝色背景上有白色文本 当选择文本时 通过长按和编辑对话框 我希望突出显示为白色并将文本颜色更改为黑色 令人烦恼的是 似乎没有办法
  • 同时有两个操作栏(底部和向上)?

    我需要制作两个操作栏 顺便说一下我正在使用actionBarSherlock 所以我真正需要的是在正常操作栏上放置一个 欢迎屏幕 开关 并添加两个正常的 ActionBar 操作选项 与我需要的类似的是 Gmail 和地图 如下所示 htt

随机推荐

  • WSL2的安装详细过程(转载)

    这部分记录了如何安装wsl 以及如何升级到wsl2的心酸历程 文章目录 版本要求 升级windows WSL的安装 升级到WSL2 安装linux分发版 排查安装问题 相关链接 记录所踩的坑 版本要求 安装wsl2对系统版本有硬性的要求 运
  • mysql的行转列和列转行

    一 行转列 即将原本同一列下多行的不同内容作为多个字段 输出对应内容 建表语句 DROP TABLE IF EXISTS tb score CREATE TABLE tb score id INT 11 NOT NULL auto incr
  • 语义分割常用数据集整理

    语义分割的数据集分为三类 2D图片 2 5D图片 RGB D 3D图片 每一个类别的数据集都提供了像素级的标签 可以用来评估模型性能 同时其中一部分工作用到了数据增强来增加标签样本的数量 一 2D数据 1 PASCAL Visual Obj
  • 更换 CentOS 7 的下载源为阿里云

    1 备份 mv etc yum repos d CentOS Base repo etc yum repos d CentOS Base repo backup 2 下载新的CentOS Base repo 到 etc yum repos
  • vue3 hooks的简单使用 组合式函数

    想当于vue2的mixins 我们可以使用hooks代替mixins 官方文档 组合式函数 hooks 特点 vue3 中的 hooks 函数相当于 vue2 里面的 mixin 混入 不同在于 hooks 是函数 vue3 中的 hook
  • 离线脱机局域网环境安装visual studio2019企业版

    我这个文章借鉴了网友的一些方法 自己改编的用于记录以后方便自己用 亲测2022社区版可能因为我电脑的win10系统不完善的原因 无法 安装 最后试了2019企业版成功安装 1 在官网下载安装包 点击跳转 2 点开的网页 我英语不好 我翻译了
  • 终极篇 C++算法到安卓的移植——AS调用VS的so库

    目的 windows平台下的c 算法 需要移植到安卓系统上 平时用惯了Visual Studio 再在其他软件上重新写算法 调试算法 实在头疼 所以我用VS的c 移动开发功能创建动态共享库 将算法内容放入 并实现JNI和JAVA接口部分 最
  • libvirt介绍和使用

    libvirt介绍和使用 导读 why what libvirt具体介绍 API 剖析 driver 剖析 如何使用libvirt why what 实现一朵可运行 可运维的云 需要完整的实现三层 VIM层 VNFM层 NFVO层 其中实现
  • C语言文件操作详解(解析各文件函数,如何应用文件函数)

    前言 我们为什么要在C语言中引进文件的概念呢 试想一个场景 我们写好了通讯录的源代码运行后录入了联系人的信息 但是每次的操作范围只局限在此次的执行程序中 执行程序一关 联系人的信息随着执行程序在内存中的消失而消失 因此 我们需要把联系人信息
  • 算法训练营day48

    文章目录 198 打家劫舍 思路分析 代码实现 思考总结 213 打家劫舍II 思路分析 代码实现 337 打家劫舍 III 树形DP 思路分析 代码实现 思考总结 198 打家劫舍 题目链接 你是一个专业的小偷 计划偷窃沿街的房屋 每间房
  • Java String 类练习

    文章目录 前言 一 一些常用的String方法 二 StringBuffer和StringBuilder 1 StringBuffer 2 StringBuilder 一个小项目 学生信息查询系统 简易版 前言 字符串广泛应用 在 Java
  • Docker跨CPU架构使用

    CPU架构 amd64 x86 arm64 mips64el等等 amd64 CPU架构的电脑默认是不能使用其他架构的镜像 但可以通过qemu的技术来实现 Docker跨CPU使用 举例说明 x86 64 CPU架构的电脑运行 ARM64
  • 性能测试:工具篇:Jmeter实时可视化平台搭建

    部署 influxDB 首先 pull influxBD镜像 拉取是1 8的版本 虽有2 0 的版本 但我还是喜欢站在巨人的肩头前行 debugfeng debugfeng sudo docker pull influxdb 1 8 1 8
  • sql for 循环

    declare i int set i 1 while i lt 100 begin update top 1 t set name i where name 123 set i i 1 end
  • SQL Server 数据库实验课第七周——授权:授予与收回

    目录 4 2 3 自主存取控制方法 4 2 4 授权 授予与收回 1 GRANT 2 REVOKE 4 2 5 数据库角色 4 2 3 自主存取控制方法 通过 SQL 的GRANT 语句和REVOKE 语句实现 定义用户存取权限 定义用户可
  • [Echarts可视化] 二.php和ajax连接数据库实现动态数据可视化

    前一篇文章 Echarts可视化 一 入门篇之简单绘制中国地图和贵州地区 主要是通过Echarts可视化介绍入门知识 中国地图和贵州地区各省份的数据分析 其中贵州地图才是它的核心内容 这篇文章主要结合PHP MySQL JQuery和Aja
  • android手机设置固定dns,手机怎么设置dns 手机设置dns方法【详解】

    很多时候 你去一个地方或者自己 的网络DNS解析的速度会直接影响你的网速 不信你打开一个网页 然后看浏览器的左下角的状态 经常会卡在解析 而且 大多数自用的带有路由的网络都默认的是自动获得DNS地址 造成每次链接的速度体验等不一致 直观感觉
  • 华夏食无忧上榜“2021亚洲品牌500强”品牌价值跃升至700.95亿元

    会议现场 同步品牌中国战略 品牌决胜未来 9月28日 第16届亚洲品牌盛典在海南自贸港隆重举行 本届活动由专业品牌评价机构Asiabrand 亚洲品牌集团 发起主办 中国亚洲经济发展协会 一带一路总商会 环球时报 社 澳门商报 东盟 中国工
  • nvme装系统不能自引导_怎么让老电脑实现UEFI启动NVME SSD固态硬盘进系统方法

    可能很多人不知道如果你买的是NVME的固态硬盘可能有些老电脑是不能使用的 因为很多老主板的bios是不支持UEFI的 也就是说不带UEFI bios 所以如果有人想把NVME的固态硬盘给老主板用的话 就需要想想办法了 首先我们可以用硬改bi
  • 设计模式之迭代器模式

    迭代器模式源于对容器的访问 比如java中的List Map 数组等 我们知道对容器对象的访问必然会涉及遍历算法 我们可以将遍历的方法封装在容器中 或者不提供遍历方法 如果我们将遍历的方法封装到容器中 那么对容器类来说就承担了过多的功能 容