設計模式之迭代器模式

迭代器模式(Iterator),其含義是提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內部表示。這一模式的關鍵思想是將對列表的訪問和遍歷從列表對象中分離出來並放入一個迭代器對象中。迭代器類定義了一個訪問該列表元素的接口。能夠理解爲咱們常見的java集合中的Iterator接口,很是相似。

其適用性:java

訪問一個聚合對象的內容而無需暴露它的內部表示,ide

支持對聚合對象的多種遍歷,測試

爲遍歷不一樣的聚合結構提供一個統一的接口(即,支持多態迭代)。 this

其結構圖:spa

                             

迭代器和列表式耦合在一塊兒的,並且客戶對象必須知道遍歷的是一個列表而不是其餘聚合結構,咱們在使用時其實有兩個迭代器,一個是外部迭代器,另外一個是內部迭代器,外部迭代器是由客戶端主動推動遍歷的步伐,顯示地向迭代器請求下一個元素,而內部迭代器客戶只需向其提交一個代執行的操做,而迭代器將對聚合中的每個元素實施該操做。code

在實現時, Iterator類有一個屬性是Aggregate的實例,該方式是對象適配器的運用,Iterator的相關操做都是底層經過Aggregate的實例來實現的。如:對象

package  org.designpattern.behavioral.iterator;
public  abstract  class Iterator {
     protected Aggregate aggregate;
     protected  int index;

     public Aggregate getAggregate() {
         return aggregate;
    }

     public  void setAggregate(Aggregate aggregate) {
         this.aggregate = aggregate;
    }
     public  abstract  void first();
     public  abstract  void next();
     public  abstract  void last();
     public  abstract  boolean isDone();
     public  abstract Object currentItem();
}

  Aggregate定義接口操做(在此略去),由本身的實現類實現:blog

package  org.designpattern.behavioral.iterator;
import java.util.ArrayList;

public  class ConcreteAggregate  extends Aggregate{
     private  Object[] objs;
     public ConcreteAggregate(){
         this.objs =  new Object[32];
         this.size = 0;
    }
    @Override
     public Iterator createIterator() {
        Iterator iterator =  new ConcreteIterator();
        iterator.setAggregate( this);
         return iterator;   // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public Object getItem( int index) {
         return  this.objs[index];   // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public  int getSize() {
         return  this.size ;   // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public  void addObject(Object obj) {
         this.objs[ this.size] = obj;
         this.size++;
         // To change body of implemented methods use File | Settings | File Templates.
    }
}

  Iterator的子類操做均是經過Aggregate的實現類來實現:接口

package  org.designpattern.behavioral.iterator;
public  class ConcreteIterator  extends Iterator {
     public ConcreteIterator(){
         this.index = 0;
    }

    @Override
     public Object currentItem() {
         return  this.getAggregate().getItem( this.index);   // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public  void first() {
         this.index = 0;
         // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public  void next() {
         if( this.index <  this.getAggregate().getSize()){
             this.index ++;
        }
         // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public  void last() {
         this.getAggregate().getSize();
         // To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
     public  boolean isDone() {
         return  this.index ==  this.getAggregate().getSize();   // To change body of implemented methods use File | Settings | File Templates.
    }

} get

 客戶端測試類就能夠直接像使用普通的迭代器同樣使用了。由此看迭代器將具體的集合類和迭代類分離開來,使用迭代器和具體集合類的複用性更佳,且外界代碼使用時能夠使用迭代器遍歷集合,從而無需關心集合的內部細節。

相關文章
相關標籤/搜索