迭代器模式

2023-05-16

迭代器模式

标签 : Java与设计模式


迭代器模式: 提供一种方法顺序访问聚合对象(如ListSet)内的每个元素, 而又不暴露聚合对象的内部实现.

(图片来源: 设计模式: 可复用面向对象软件的基础)


模式实现

Iterator & Aggregate

  • Iterator: 迭代器
    定义访问和遍历元素的接口
  • Aggregate: 聚合
    定义创建响应迭代器对象的接口

由于Java已内置了java.lang.Iterablejava.util.Iterator接口, 而Iterable可以作为Aggregate存在(Abstract), 因此在Java中实现迭代器便可不用再定义这两个接口.


ConcreteAggregate & ConcreteIterator

  • ConcreteAggregate: 具体聚集
    实现Iterable接口, 返回ConcreteIterator的一个适当的实例;
  • ConcreteIterator : 具体迭代器
    实现Iterator接口(最好作为具体聚集的内部类), 对该聚集遍历时跟踪当前位置.
/**
 * @author jifang
 * @since 15/12/15 下午8:33.
 */
public class ConcreteAggregate implements Iterable<String> {

    private List<String> list;

    public ConcreteAggregate() {
        this.list = new ArrayList<>();
    }

    public void add(String item) {
        list.add(item);
    }

    public String get(int index) {
        return list.get(index);
    }

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

    /**
     * 具体迭代器实现类
     */
    private class ConcreteIterator implements Iterator<String> {

        // 游标
        int cursor = 0;
        // 比游标慢一个元素
        int lastRet = -1;

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

        @Override
        public String next() {
            if (cursor >= list.size())
                throw new NoSuchElementException();
            ++cursor;
            return list.get((lastRet = cursor - 1));
        }

        @Override
        public void remove() {
            list.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
        }
    }
}
  • Client
public class Client {

    @Test
    public void client(){
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.add("aa");
        aggregate.add("bb");
        aggregate.add("remove");
        aggregate.add("cc");
        aggregate.add("dd");
        aggregate.add("remove");
        aggregate.add("ee");

        Iterator<String> iter = aggregate.iterator();
        while (iter.hasNext()){
            String item = iter.next();
            System.out.println(item);

            if (item.equals("remove")){
                iter.remove();
            }
        }

        System.out.println("********----------********");
        for (String item : aggregate){
            System.out.println(item);
        }
    }
}

小结

  • 适用

    • 访问一个聚集对象的内容而无需暴露它的内部表示;
    • 支持对聚集对象的多种遍历(如: 不光可以正向遍历, 还可以反向遍历容器元素.);
    • 为遍历不同的聚合结构提供一个统一的接口(即: 支持多态迭代).
  • Iterator使用场景不必多言, 由于Java已经将其固化到语言中,因此开发中天天都在使用:

    • 当需要访问一个聚集对象, 且不需要了解其内部实现的时, 就应该考虑使用迭代器模式.
    • 当需要对聚集有多种方式遍历时, 可以考虑使用迭代器模式.

参考
设计模式: 可复用面向对象软件的基础
迭代器模式(Iterator)- 指尖飞舞
大话设计模式
高淇讲设计模式

  • by 攻城师@翡青
    • Email: feiqing.zjf@gmail.com
    • 博客: 攻城师-翡青 - http://blog.csdn.net/zjf280441589
    • 微博: 攻城师-翡青 - http://weibo.com/u/3319050953

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

迭代器模式 的相关文章

随机推荐

  • defined but not used [-Wunused-function] 使用 __attribute__((unused)) 告诉编译器忽略此告警

    在C程序中 xff0c 如果定义了一个静态函数或变量 xff0c 而没有去使用 xff0c 编译时会有一个警告 xff1a 39 at wait send finish 39 defined but not used Wunused fun
  • 【QT】串口调试助手(串口编程代码详解)

    目录 1 串口助手最终成品效果 1 1 串口功能描述 1 2 串口接收数据显示图 1 3 串口发送数据显示图 2 项目编程代码详解 2 1 项目框架 2 2 工程配置 serial pro 2 3 设计布局 serial ui 2 4 串口
  • 【Linux-ARM】安装海思himix200交叉编译openssl-arm静态库与动态库

    目录 一 安装海思himix200交叉编译工具链 1 编译环境 编辑 编辑 2 安装说明 3 配置参数 4 编译 5 查看环境变量 6 查看安装后版本 二 arm himix200 linux 交叉编译openssl arm静态库与动态库
  • 【Linux-ARM】电脑 WiFi 上网,开发板与电脑直连

    目录 1 准备工作 2 VMware 设置 3 Ubuntu 设置 4 Windows 设置 5 开发板设置 6 ping 测试 7 小结 1 准备工作 使用场景 xff1a 路由器离电脑比较远 xff0c 只有一条网线 设备 xff1a
  • 【Linux-ARM】arm-sgmstar-gnueabihf-9.1.0-202007-gcc交叉编译openssl、curl静态库.a与动态库.so

    编译环境 xff1a ubuntu 18 04 一 安装交叉编译器arm sgmstar gnueabihf 9 1 0 202007 gcc 1 下载交叉编译包 ARM交叉编译器的免安装解压包链接 xff1a ARM交叉编译器 xff1a
  • Python安装第三方库PIL时失败的解决办法

    Python中 xff0c 安装第三方模块 xff0c 是通过setuptools这个工具完成的 Python有两个封装了setuptools的包管理工具 xff1a easy install和pip 目前官方推荐使用pip 安装一个第三方
  • 小程序游戏开发一般多少钱?游戏小程序开发制作

    小程序游戏开发一般多少钱 xff1f 游戏小程序开发制作 有网友咨询我们小程序游戏开发一般多少钱 xff1f 关于游戏小程序开发制作 xff0c 我们公司涉及的开发案例比较少 xff0c 开发游戏小程序的成本要比商城小程序 xff0c 或者
  • MySQL学习笔记_9_MySQL高级操作(上)

    MySQL 高级操作 xff08 上 xff09 一 MySQL 表复制 create table t2 like t1 复制表结构 xff0c t2 可以学习到 t1 所有的表结构 insert into t2 select from t
  • MySQL学习笔记_10_MySQL高级操作(下)

    MySQL 高级操作 xff08 下 xff09 五 MySQL 预处理语句 1 设置预处理 stmt xff0c 传递一个数据作为 where 的判断条件 prepare stmt from select from table name
  • Linux下的tree命令 --Linux下目录树查看

    Linux下的tree命令 Linux下目录树查看 有时我们需要生成目录树结构 可以使用的有ls R 但是实际效果并不好 这时需要用到tree命令 但是大部分Linux系统是默认不安装该命令的 需要自己安装一下 tree的常见用法 tree
  • gcc学习(一)[第二版]

    gcc简介 1 gcc是GNU Compiler Collection的缩写 最初是作为C语言的编译器 xff08 GNU C Compiler xff09 作者为Richard Stallman xff0c 是GNU项目的奠基者 现在已经
  • Socket编程实践(9) --套接字IO超时设置方法

    引 超时设置3种方案 1 alarm超时设置方法 代码实现 这种方式较少用 void sigHandlerForSigAlrm int signo return signal SIGALRM sigHandlerForSigAlrm ala
  • 岁月划过生命线(从0到阿里)

    从来没有想到自己的求职之路会这么顺利 第一次投阿里就拿到了offer 以前一直都是做好被刷的准备的 3月31号晚上收到了来自阿里的正式offer 签下录取意向书 粗略算了一下 从2012年9月份正式入学进入计算机系到2015年3月签下阿里o
  • MyBatis 实践 -Mapper与DAO

    MyBatis 实践 标签 xff1a Java与存储 MyBatis简介 MyBatis前身是iBatis 是一个基于Java的数据持久层 对象关系映射 ORM 框架 MyBatis是对JDBC的封装 使开发人员只需关注SQL本身 而不需
  • Maven 核心原理

    Maven 核心原理 标签 xff1a Java基础 Maven 是每一位Java工程师每天都会接触的工具 但据我所知其实很多人对Maven理解的并不深 只把它当做一个依赖管理工具 下载依赖 打包 Maven很多核心的功能反而没用上 最近重
  • JVM初探 -JVM内存模型

    JVM初探 JVM内存模型 标签 xff1a JVM JVM是每个Java开发每天都会接触到的东西 其相关知识也应该是每个人都要深入了解的 但接触了很多人发现 或了解片面或知识体系陈旧 因此最近抽时间研读了几本评价较高的JVM入门书籍 算是
  • Docker: USER 指定当前用户

    Docker USER 指定当前用户 格式 xff1a USER lt 用户名 gt USER 指令和 WORKDIR 相似 xff0c 都是改变环境状态并影响以后的层 WORKDIR 是改变工作目录 xff0c USER 则是改变之后层的
  • 岁月划过生命线(2016 年终总结 -季度之星)

    岁月划过生命线 2016 年终总结 季度之星 标签 xff1a coder 年假结束 明天就要回到杭州 回到我fighting的战场 回首过去的2016 放纵了许多 但也收获了很多 n个项目 n个框架 第一个季度之星 头像第一次登上CSDN
  • 备忘录模式

    备忘录模式 标签 xff1a Java与设计模式 备忘录模式 在不破坏封装性的前提下 捕获一个对象的内部状态 or 拷贝 并在该对象之外保存这个状态 这样以后就可 将该对象恢复到原先保存的状态 图片来源 设计模式 可复用面向对象软件的基础
  • 迭代器模式

    迭代器模式 标签 xff1a Java与设计模式 迭代器模式 提供一种方法顺序访问聚合对象 如List Set 内的每个元素 而又不暴露聚合对象的内部实现 图片来源 设计模式 可复用面向对象软件的基础 模式实现 Iterator amp A