設計模式GOF23——迭代器模式

迭代器模式(iterator),又稱爲遊標(cursor)模式,是一種行爲性模型,行爲型模式關注的是系統中對象之間的相互交互,解決系統在運行時對象之間的相互通信和協作,進一步明確對象的職責。相比來說,創建型模式關注對象的創建過程,結構型模式關注對象和類的組合關係。

模式的職責

提供一種可以遍歷聚合對象的方式。

模式的結構

聚合對象:存儲數據
迭代器:遍歷數據

模式的實現

public interface MyIterator {
    void first();//將遊標指向第一個元素()
    void next();//將遊標指向下一個元素
    Object getCurrentObj();
    boolean hasNext();//判斷是否有下一個元素
    //這兩個可以有也可以沒有
    boolean isfirst();//判斷是否是第一個元素
    boolean isLast();//判斷是否是最後一個元素
}
public class ConcreteMyaggregate {
    //承載需要迭代的容器
    private List<Object> list = new ArrayList<Object>();
    public ConcreteMyaggregate(List<Object> list){
        super();
        this.list =list;
    }
    public void addObject(Object obj){
        list.add(obj);
    }
    public void removeObject(Object obj){
        list.remove(obj);
    }
    public List<Object> getList() {
        return list;
    }
    public void setList(List<Object> list) {
        this.list = list;
    }
    //外部獲得迭代器的類的方法
    public MyIterator createIterator(){
        return new ConcreteItertor();
    }
    //使用內部類定義迭代器,可以直接使用外部類的屬性
    private class ConcreteItertor implements MyIterator{
        //迭代器的遊標
        private int cursor;
        public void first() {
            cursor = 0;
        }
        //迭代器的真正實現
        public Object getCurrentObj() {
            return list.get(cursor);
        }
        public boolean hasNext() {
            if(cursor<list.size()){
                return true;
            }
            return false;
        }

        public boolean isLast() {
            return cursor == (list.size()-1)?true:false;
        }

        public boolean isfirst() {
            return cursor == 0?true:false;
        }

        public void next() {
            if(cursor<list.size())
            cursor++;
        }
    }
}
//客戶端調用
public class Client {

    public static void main(String[] args) {
        //創建容器,往容器中放入對象
        ConcreteMyaggregate cma = new ConcreteMyaggregate(null);
        cma.addObject("a");
        cma.addObject("b");
        cma.addObject("c");
        //創建迭代器,取出對象
        MyIterator iter = cma.createIterator();
        //只要還有對象,就取出對象,並把遊標往下一個
        while(iter.hasNext()){
            System.out.println(iter.getCurrentObj());
            iter.next();
        }
    }

}

其他說明

這個實現案例是用正向遍歷的迭代器,其實也可以實現逆向遍歷的迭代器(就是每次都把遊標向前一位的那種)。
JDK內置的迭代器(List/Set)裏面也是用的這種方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章