zoukankan      html  css  js  c++  java
  • 迭代器模式

    一、模式名

    迭代器, Iterator

    二、解决的问题

    迭代器主要用于按照某种顺序遍历访问某个集合,提出的目的是为了解耦对集合遍历过程和集合对象。访问集合的方法有很多,使用迭代器可以自定义遍历集合元素的方法,每当新增一种访问方法时,不需要修改集合类,只需新增新的访问集合的迭代类,保证了开闭原则。

    三、解决方案

    迭代器的UML如下图所示

    clipboard

    代码如下

    interface Collection<E> {
        void add(E e);
        E get(int i);
        int size();
        Iterator iterator();
    }
    
    class ConcreteCollection<E> implements Collection<E> {
    
        private Object[] eles;
        private int currentIndex;
    
        public ConcreteCollection(int length) {
            eles = new Object[length];
            currentIndex = 0;
        }
    
        @Override
        public void add(E e) {
            if (currentIndex < eles.length) {
                eles[currentIndex++] = e;
                return;
            }
    
            System.out.println("超过数组长度");
        }
    
        @Override
        public E get(int i) {
            if (i < 0 || i >= eles.length) {
                return null;
            }
    
            return (E) eles[i];
        }
    
        @Override
        public int size() {
            return currentIndex;
        }
    
        @Override
        public Iterator iterator() {
            return new ConcreteIterator(this);
        }
    }
    
    
    interface Iterator<E> {
        E next();
        boolean hasNext();
    }
    
    class ConcreteIterator<E> implements Iterator<E> {
    
        private Collection<E> collection;
        private int cursor;
    
        public ConcreteIterator(Collection<E> collection) {
            this.collection = collection;
            cursor = 0;
        }
    
        @Override
        public E next() {
            if (hasNext()) {
                return collection.get(cursor++);
            }
    
            return null;
        }
    
        @Override
        public boolean hasNext() {
            return cursor < collection.size();
        }
    }
    
    
    public class IteratorClient {
        public static void main(String[] args) {
            Collection<String> collection = new ConcreteCollection<>(10);
    
            for (int i = 0; i < 10; ++i) {
                collection.add(i + "");
            }
    
            Iterator<String> concreteIterator = new ConcreteIterator<>(collection);
    
            while (concreteIterator.hasNext()) {
                String next = concreteIterator.next();
                System.out.println(next);
            }
        }
    }

    如果后续我们需要对集合增加新的遍历方法,只需要实现对该集合的迭代器即可,不需要修改原有集合类。

    应用场景:

    Java 集合类中每个具体的集合都有对应的迭代器

  • 相关阅读:
    关于OutputStream的write方法FAQ(from bbs.csdn.net)
    【Java】对文件或文件夹进行重命名
    [复习] JAVA 遍历目录 (递归调用和非递归)
    [科普]关于文件头的那些事
    Intellij IDEA和EclipsE之间的的全面对比
    为什么43%前端开发者想学Vue.js
    Chrome调试ECMAScript之断点debug技巧大全!
    如何Vue-cli开始使用在Vue.js项目中启动TDD(测试驱动开发)
    toString() 和 (String) 以及 valueOf() 三者的对照关系[java]
    java打印和重写toString
  • 原文地址:https://www.cnblogs.com/glsy/p/11048780.html
Copyright © 2011-2022 走看看