• JAVA设计模式第八章:迭代器模式(Iterator Pattern)


    迭代器模式(Iterator Pattern)

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

    1. 什么是迭代器模式

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

    2. 为什么要用迭代器模式

    1. 迭代器模式简化了集合的遍历操作,开发人员可是使用相同的代码遍历不同的集合;
    2. 扩展性强,可以在不修改原有代码情况下创建自己的迭代器;

    3. 案列- ArrayList

    java中ArrayList的实现过程

    1. ArrayList通过继承间接实现了Iterable接口,Iterable表示这个集合是可以被迭代的;
    2. Iterable接口中有一个关键方法iterator()返回一个迭代器对象Iterator;
    3. ArrayList有一个内部类实现了Itr实现了Iterator接口;
    4. ArrayList的iterator()方法直接放回Itr()对象;
      在这里插入图片描述

    在这里插入图片描述

    4. 自己扩展实现一个ArrayList的迭代器

    这个是实现为最简单的实现,对比JDK自己的实现少了很多校验逻辑,仅供学习测试

    package com.cans;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * 自定义迭代器 倒序输出
     *
     * @author shenc
     * @date 2022-09-06 16:34
     **/
    public class MyIterator<E> implements Iterator<E>{
        int cursor;       // index of next element to return
        int size;
        ArrayList<E> arrayList;
    
        public MyIterator(ArrayList<E> arrayList) {
            this.arrayList = arrayList;
            this.size = arrayList.size();
            this.cursor = arrayList.size();
        }
    
        @Override
        public boolean hasNext() {
            return cursor != 0;
        }
    
        @Override
        public E next() {
            E e = arrayList.get(cursor-1);
            cursor --;
            return e;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    测试代码

    import com.cans.MyIterator;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * 类描述
     *
     * @author shenc
     * @date 2022-09-06 17:02
     **/
    public class MyIteratorTest {
    
        @Test
        public void test1(){
            ArrayList<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(2);
            list.add(3);
    
            Iterator<Integer> iterator = list.iterator();
    
            System.out.println("====================顺序====================");
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
            System.out.println("====================倒序====================");
            MyIterator<Integer> myIterator = new MyIterator<>(list);
    
            while (myIterator.hasNext()){
                System.out.println(myIterator.next());
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    结果输出:

    顺序
    1
    2
    3
    倒序
    3
    2
    1
    Process finished with exit code 0

  • 相关阅读:
    rhce第一天笔记
    [纯理论] FPN (Feature Pyramid Network)
    CPVT(ICLR 2023)论文解读
    告别单调,Django后台主页改造 - 使用AdminLTE组件
    FFmpeg命令行实践二
    4. Java 的线程安全机制之`volatile`
    40Java Runtime类
    写给小白 : 如何学习编程?
    牛客网刷题 | BC62 统计数据正负个数
    jmap执行失败了,怎么获取heapdump?
  • 原文地址:https://blog.csdn.net/shencange/article/details/125817203