結合案例深刻解析迭代器模式

1、基本概念

迭代器模式屬於行爲型模式。數組

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

若是咱們須要統一遍歷不一樣的集合(容器),也能夠利用迭代器模式解決(下面的案例就是解決這個問題)。分佈式

2、結構

結構:ide

 

 

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

3、案例

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

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

 

 

代碼:測試

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

 

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

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;
        }
    }
}

 

測試:code

// 若是不這麼作,須要區分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();
        }
    }
}

 

輸出:orm

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

 

4、總結

優勢:對象

  • 在同一個聚合上能夠有多個遍歷;
  • 在迭代器模式中,增長新的聚合類和迭代器類都很方便,無須修改原有代碼;
免費Java高級資料須要本身領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G。
傳送門:
相關文章
相關標籤/搜索