当前位置: 首页 > news >正文

结合案例深入解析迭代器模式

一、基本概念

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

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

如果我们需要统一遍历不同的集合(容器),也可以利用迭代器模式解决(下面的案例就是解决这个问题)。

二、结构

结构:

 

 

  • Container 是聚合类,其中 getIterator() 方法可以产生一个 Iterator
  • Iterator 主要定义了 hasNext() 和 next() 方法;
  • 每一个Container的实现类都会有一个具体的Iterator实现类来帮助实现迭代;

三、案例

实现两个容器能够统一遍历。(或者两个以上)

先看代码结构: (这里我将两个迭代器实现类写在两个容器内部)

 

 

代码:

public interface Container {
    Iterator getIterator();
}
public interface Iterator<E> {
    boolean hasNext();
    E next();
}

 

两个容器类,他们内部的容器不同,内部有自带不同的迭代器:

public class ConcreteContainer1 implements Container {

    public Integer[] arr;

    public ConcreteContainer1() {
        arr = new Integer[10];
        for(int i = 0; i < 10; i++) arr[i] = i;
    }

    @Override
    public Iterator getIterator() {
        return new ConcreteIterator1<Integer>();
    }

    private class ConcreteIterator1<E> implements Iterator{

        int index;

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

        @Override
        public Object next() {
            if(hasNext())
                return arr[index++];
            return null;
        }
    }
}
public class ConcreteContainer2 implements Container {

    public ArrayList arr;

    public ConcreteContainer2() {
        arr = new ArrayList();
        for(int i = 0; i < 10; i++) arr.add(i);
    }

    @Override
    public Iterator getIterator() {
        return new ConcreteIterator1<Integer>();
    }

    private class ConcreteIterator1<E> implements Iterator{

        int index;

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

        @Override
        public Object next() {
            if(hasNext())
                return arr.get(index++);
            return null;
        }
    }
}

 

测试:

// 如果不这么做,需要区分c1和c2的遍历方式, 一个是数组,一个是List
public class MyTest {

    public static void main(String[] args){
        Container c1 = new ConcreteContainer1();
        Container c2 = new ConcreteContainer2();

        ArrayList<Iterator>its = new ArrayList<>();
        its.add(c1.getIterator()); // 将c1迭代器加入its
        its.add(c2.getIterator()); // 将c1迭代器加入its

        // 实现了统一遍历, 只需要将迭代器加入到 its中即可
        for(Iterator it : its) {
            while(it.hasNext())
                System.out.print( it.next() + " ");
            System.out.println();
        }
    }
}

 

输出:

0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9

 

四、总结

优点:

  • 在同一个聚合上可以有多个遍历;
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码;
免费Java高级资料需要自己领取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G。
传送门:

转载于:https://www.cnblogs.com/yuxiang1/p/11044984.html

相关文章:

  • laravel5.5入门-安装和认证
  • 没事干 回忆下快排
  • 并发
  • 微信-小程序-开发文档-服务端-模板消息:templateMessage.deleteTemplate
  • SmartGit 合并分支,图文
  • mysql创建用户
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • linux内核代码基础篇(一)一目录架构说明
  • 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计
  • WPF — Grid布局中行的高度和列的高度值定义的三种形式
  • 判断两个字符串是否互为变形词
  • Blob
  • JVM学习笔记:对象的内存布局和访问定位
  • 图像质量评估-锐度
  • NKOJ4241 蚯蚓 (【NOIP2016 DAY2】)
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Java 多线程编程之:notify 和 wait 用法
  • jQuery(一)
  • npx命令介绍
  • pdf文件如何在线转换为jpg图片
  • python 装饰器(一)
  • Redis的resp协议
  • 番外篇1:在Windows环境下安装JDK
  • 官方解决所有 npm 全局安装权限问题
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 每天10道Java面试题,跟我走,offer有!
  • 那些年我们用过的显示性能指标
  • 前端性能优化--懒加载和预加载
  • 使用 @font-face
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • !!java web学习笔记(一到五)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (多级缓存)缓存同步
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (黑马C++)L06 重载与继承
  • (接口自动化)Python3操作MySQL数据库
  • (力扣题库)跳跃游戏II(c++)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)虚函数剖析
  • *上位机的定义
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net打印*三角形