設計模式-行爲型- 迭代器模式(Iterator)

定義

又叫遊標(Cursor)模式,提供一種方法訪問一個容器(container)對象中的各個元素,而又不暴露該對象的內部細節

角色

迭代器角色(Iterator):負責定義訪問和遍歷元素的接口

具體迭代器角色(Concrete Iterator):實現迭代器接口,並要記錄遍歷中的當前位置

容器角色(Container):負責提供創建具體迭代器角色的接口

具體容器角色(Concrete Container):實現創建具體迭代器角色的接口, 這個具體迭代器角色與該容器的結構相關

優點

  • 它支持以不同的方式遍歷一個聚合對象
  • 在同一個聚合上可以有多個遍歷
  • 增加新的聚合類和迭代器類都很方便,無須修改原有代碼

缺點

  • 新增一個聚合類,就要相應的實現一個迭代器類,類的個數增多

適用場景

  • 訪問一個對象的內容,又不想暴露對象的內部結構
  • 對對象進行遍歷

類圖

Iterator

package com.vapy.behavior.Iterator;
/**
 * 
 * @author vapy 2016年8月27日
 * 
 */
public interface Aggregat {
    public Iterator createIterator();
    public void add(Object obj);
}
package com.vapy.behavior.Iterator;

import java.util.Vector;
/**
 * 
 * @author vapy 2016年8月27日
 * 
 */
public class ConcreteAggregat implements Aggregat {
    private Vector<Object> vector = null;

    public Vector<Object> getVector() {
        return vector;
    }

    public void setVector(Vector<Object> vector) {
        this.vector = vector;
    }

    public ConcreteAggregat(){
        vector = new Vector<Object>();
    }

    @Override
    public void add(Object obj) {
        vector.add(obj);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(vector);
    }

}
package com.vapy.behavior.Iterator;
/**
 * 
 * @author vapy 2016年8月27日
 * 
 */
public interface Iterator {
    public Object next();
    public Object currentItem();
    public boolean isDone();
    public Object first();
}
package com.vapy.behavior.Iterator;

import java.util.Vector;
/**
 * 
 * @author vapy 2016年8月27日
 * 
 */
public class ConcreteIterator implements Iterator {
    private int cursor = -1;
    private Vector<Object> vector = null;

    public ConcreteIterator(final Vector<Object> vector){
        this.vector = vector;
    }

    @Override
    public Object first() {
        return vector.get(0);
    }

    @Override
    public Object next() {
        cursor ++;
        return vector.get(cursor);
    }

    @Override
    public Object currentItem() {
        return vector.get(cursor);
    }

    @Override
    public boolean isDone() {
        if(cursor >= this.vector.size() - 1){
            return true;
        } else {
            return false;
        }
    }
}
package com.vapy.behavior.Iterator;
/**
 * 
 * @author vapy 2016年8月27日
 * 
 */
public class Client {
    public static void main(String[] args) {
        final Aggregat agg = new ConcreteAggregat();
        agg.add("abc");
        agg.add("def");
        final Iterator iterator = agg.createIterator();
        System.out.println(iterator.first());
        while(!iterator.isDone()){
            System.out.println(iterator.next());
        }
    }
}

IteratorResult
本文代碼可在github查看:點擊此處

發佈了55 篇原創文章 · 獲贊 29 · 訪問量 123萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章