提供一種方法來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。
package com.strife.pattern.iterator;
/**
* 迭代器模式
*
* @author mengzhenghao
* @date 2022/6/2
*/
public class IteratorCode {
public static void main(String[] args) {
String[] strs = new String[]{"str1", "str2", "str3", "str4"};
ConcreteAggregate<String> aggregate = new ConcreteAggregate<>(strs);
Iterator<String> iterator = new ConcreteIterator<>(aggregate);
while (iterator.hasNext()) {
final String ne = iterator.next();
System.out.println(ne);
}
}
}
/** 抽象迭代器 */
interface Iterator<T> {
boolean hasNext();
T next();
}
/** 具體迭代器 */
class ConcreteIterator<T> implements Iterator<T> {
/** 持有被迭代的聚合對象 */
private ConcreteAggregate<T> aggregate;
/** 當(dāng)前迭代的索引位置 */
private int index;
/** 聚合對象的大小 */
private int size;
public ConcreteIterator(ConcreteAggregate<T> aggregate) {
this.aggregate = aggregate;
this.index = -1;
this.size = aggregate.size();
}
@Override
public boolean hasNext() {
return index < aggregate.size() - 1;
}
@Override
public T next() {
return aggregate.getElement(++index);
}
}
/** 統(tǒng)一的聚合接口,將客戶端和具體聚合解耦 */
abstract class AbstractAggregate<T> {
/** 創(chuàng)建相應(yīng)迭代器對象的接口 */
public abstract Iterator<T> createIterator();
}
/** 具體聚合,持有對應(yīng)的集合 */
class ConcreteAggregate<T> extends AbstractAggregate<T> {
private T[] array;
public ConcreteAggregate(T[] array) {
this.array = array;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public T getElement(int index) {
if (index < array.length) {
return array[index];
} else {
return null;
}
}
public int size() {
return array.length;
}
}