一、基本概念

迭代器模式屬於行為型模式。

這種模式用於順序訪問集合對象的元素,不需要知道集合對象的底層表示。

如果我們需要統一遍歷不同的集合(容器),也可以利用迭代器模式解決(下面的案例就是解決這個問題)。

二、結構

結構:

  • Container 是聚合類,其中 getIterator() 方法可以產生一個 Iterator
  • Iterator 主要定義了 hasNext()next() 方法;
  • 每一個Container的實現類都會有一個具體的Iterator實現類來幫助實現迭代;

三、案例

實現兩個容器能夠統一遍歷。(或者兩個以上)

先看代碼結構: (這裡我將兩個迭代器實現類寫在兩個容器內部)

代碼:

public interface Container {
Iterator getIterator();
}
public interface Iterator<E> {
boolean hasNext();
E next();
}

兩個容器類,他們內部的容器不同,內部有自帶不同的迭代器:

public class ConcreteContainer1 implements Container {

public Integer[] arr;

public ConcreteContainer1() {
arr = new Integer[10];
for(int i = 0; i < 10; i++) arr[i] = i;
}

@Override
public Iterator getIterator() {
return new ConcreteIterator1<Integer>();
}

private class ConcreteIterator1<E> implements Iterator{

int index;

@Override
public boolean hasNext() {
if(index < arr.length)
return true;
return false;
}

@Override
public Object next() {
if(hasNext())
return arr[index++];
return null;
}
}
}
public class ConcreteContainer2 implements Container {

public ArrayList arr;

public ConcreteContainer2() {
arr = new ArrayList();
for(int i = 0; i < 10; i++) arr.add(i);
}

@Override
public Iterator getIterator() {
return new ConcreteIterator1<Integer>();
}

private class ConcreteIterator1<E> implements Iterator{

int index;

@Override
public boolean hasNext() {
if(index < arr.size())
return true;
return false;
}

@Override
public Object next() {
if(hasNext())
return arr.get(index++);
return null;
}
}
}

測試:

// 如果不這麼做,需要區分c1和c2的遍歷方式, 一個是數組,一個是List
public class MyTest {

public static void main(String[] args){
Container c1 = new ConcreteContainer1();
Container c2 = new ConcreteContainer2();

ArrayList<Iterator>its = new ArrayList<>();
its.add(c1.getIterator()); // 將c1迭代器加入its
its.add(c2.getIterator()); // 將c1迭代器加入its

// 實現了統一遍歷, 只需要將迭代器加入到 its中即可
for(Iterator it : its) {
while(it.hasNext())
System.out.print( it.next() + " ");
System.out.println();
}
}
}

輸出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

四、總結

優點:

  • 在同一個聚合上可以有多個遍歷;
  • 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼;

免費Java高級資料需要自己領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高並發分散式等教程,一共30G。

傳送門:mp.weixin.qq.com/s/Jzdd

推薦閱讀:

相关文章