为清晰而编辑
我正在关注一组关于使用 Java 的设计模式的教程视频来演示各种模式的使用,但是当我看到标题为“迭代器设计模式”的视频时,它似乎只是使用了一个标准的 Java 迭代器。我以前在 Java 中使用过迭代器,但从未将它们作为“设计模式”教授过。在 Java 中使用迭代器和使用“迭代器设计模式”有区别吗?如果有,有什么区别?
为清晰而编辑
我正在关注一组关于使用 Java 的设计模式的教程视频来演示各种模式的使用,但是当我看到标题为“迭代器设计模式”的视频时,它似乎只是使用了一个标准的 Java 迭代器。我以前在 Java 中使用过迭代器,但从未将它们作为“设计模式”教授过。在 Java 中使用迭代器和使用“迭代器设计模式”有区别吗?如果有,有什么区别?
您在 Java 中使用的迭代器实际上实现了迭代器设计模式。他们是这样:
提供一种在不暴露其底层表示的情况下按顺序访问聚合对象的元素的方法。 -维基百科文章定义-
正如您在 Java 中的Iterable 接口的文档中所见,您所知道的大多数容器都提供了一个 Iterator 对象,用于:
按顺序访问它们的元素而不暴露它们的底层表示。
这个问题非常笼统,几乎没有上下文,但他们可能得到的是:使用迭代器(具有底层数据句柄并且可以以某种方式在序列中移动的东西)和使用迭代器之间存在差异索引(告诉你序列中有多少步的东西)来遍历类似序列的东西。
我能想到的最好的是迭代器模式用于为您的自定义集合创建一个自定义迭代器
在下面的示例中,我创建了 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 5 4 3 2 1
@Kvass 通过标记编程语言,您可以澄清问题。如果 Iterator 是一个接口,并且教程代表这个接口就可以了!
但是一些资源稍微提到了它。(检查 C# 中的 IEnumerable 或 Java 的 Iterable 通用接口可以告诉我们更多信息。使用它们可以,但不能清楚地告诉我们发生了什么。我们应该了解这个接口的过程以涵盖迭代器设计模式)
如果您需要此资源对迭代器有好处http://www.dofactory.com/Patterns/PatternIterator.aspx#_self1遍历的数据是此处的索引属性。
它可以是散列列表或其他东西。关键是获得一个抽象迭代器接口,它具有 first、next、last、currentItem 等属性。通过 CreateIterator 或 GetEnumerator 等方法。