迭代器设计模式?

时间:2013-08-12 15:38:09

标签: java design-patterns iterator

为Clarity编辑

我正在关注一些关于使用Java来演示各种模式用途的设计模式的教程视频,但当我看到标题为“迭代器设计模式”的视频时,它似乎只是使用标准的Java迭代器。我以前在Java中使用过迭代器,但从未将它们视为“设计模式”。在Java中使用迭代器和使用“迭代器设计模式”之间有区别吗?如果是这样,区别是什么?

4 个答案:

答案 0 :(得分:2)

您在Java中使用的迭代器实际上实现了Iterator design pattern。他们这样做:

  

提供一种顺序访问聚合对象元素的方法,而不暴露其基础表示。 -Wikipedia Article definition-

正如您在Java中Iterable interface的文档中所看到的,您知道的大多数容器都提供了以下的Iterator对象:

  

按顺序访问其元素,而不暴露其基础表示。

答案 1 :(得分:1)

这个问题非常普遍,只有很少的上下文,但他们可能会得到的是:使用迭代器(具有底层数据句柄并可以某种方式在序列中移动)之间存在差异并使用索引(告诉你序列中有多少步骤)来遍历类似序列的东西。

答案 2 :(得分:1)

我能想到的最好的是迭代器模式用于为自定义集合创建自定义迭代器

在下面的示例中,我创建了My Custom Collection和Custom Iterator,它将按降序迭代。

注意 - 这可以在Collections.reverseOrder()中完成。仅仅是为了说明我已经采取了这个。

package com.designpattern.behavioural.iteratorpattern;

/*
 * Java Iterator Pattern
 * Iterator Pattern allows to access the elements in an Object in a sequential manner rather than exposing the internal logic 
 * Use Case - Traverse on  different way based on the requirement
 */

/*
 * Iterator interface
 */
interface Iterator {

    public boolean hasNext();
    public Object next();

}

/*
 * Repository interface
 */
interface MyCollection {

    public Iterator getIterator();

}

/*
 * Repository and iterator implementation
 * Customized iteration - Iterate in reverse order
 */
class MyCustomCollection implements MyCollection {

    RepositoryIterator iterator = null;

    @Override
    public Iterator getIterator() {
        iterator = new RepositoryIterator();
        return iterator;
    }

    private class RepositoryIterator implements Iterator {

        String[] elements = {"1","2","3","4","5","6","7","8"};

        int index = 0;

        @Override
        public boolean hasNext() {
            if (index < elements.length) {

                return true;
            }
            return false;
        }

        @Override
        public Object next() {
            if (this.hasNext()) {
                index += 1;
                return elements[elements.length-index];

            }
            return null;
        }

    }

}

public class IteratorPattern {

    public static void main(String[] args) {

        MyCollection myCollection = new MyCustomCollection();

        for (Iterator iterator = myCollection.getIterator() ; iterator.hasNext();) {
            System.out.println(iterator.next());
        }

    }

}

输出:

8 7 6 五 4 3 2 1

答案 3 :(得分:0)

@Kvass通过标记编程语言,您可以澄清问题。 如果Iterator是一个界面,教程代表这个界面就可以了!

但是有些资源稍微提到它。(在C#中检查IEnumerable或者Java的Iterable通用接口告诉我们更多。使用它们但没有清楚地告诉我们发生了什么。我们应该理解这个接口的过程来覆盖迭代器设计图案)

如果您需要此资源适用于迭代器http://www.dofactory.com/Patterns/PatternIterator.aspx#_self1,则遍历的数据是索引属性。

它可以是散列列表或其他内容。重点是获得一个抽象迭代器接口,它具有first,next,last,currentItem之类的属性。通过CreateIterator或GetEnumerator等方法。