設計模式 -- Iterator(迭代器)

模式用途:設計能裝載任意對象的容器,並要求該容器有一個遍歷元素的iterator()方法,用來遍歷容器中的每個元素。

    設計一個容器的接口,用來定義這些能裝載任意對象的容器的方法,從而在使用這些容器的時候可以更加靈活,更換起來只需要更改裝載的容器的類型即可,其他方法都不用改變。

Ø  接口Collection.java

package com.yilong.designpattern.iterator;

public interface Collection {

 

    public void add(Object obj);

    public int size();

    public Iterator iterator();

}

Ø  實現了Collection接口的ArrayList.java

package com.yilong.designpattern.iterator;

public class ArrayList implements Collection {

   

    Object[] objs = new Object[10];

    int index = 0;

 

    public void add(Object obj) {

       if(index == objs.length) {

           Object[] newObjs = new Object[objs.length * 2];

           System.arraycopy(objs, 0, newObjs, 0, objs.length);

           objs = newObjs;

       }

       objs[index] = obj;

       index ++;

    }

 

    public Iterator iterator() {

       return new ArrayIterator(this);

    }

 

    public int size() {

       return index;

    }

   

    public Object get(int i) {

       return objs[i];

    }

}

    說明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs數組中索引爲0-objs.length的元素複製到數組newObjs中,第一個0表示從newObjs0位置開始複製。

    容器的iterator()方法會調用適合本身容器進行遍歷的迭代器Iterator

    還需要注意的一點是get(int i)方法不要放在Collection接口的方法定義中,因爲Collection接口已經有iterator()方法足以遍歷容器中元素了, 可見get(int i)方法並不是每種容器都必須的,因此更加適合於只定義在具體的容器中。

Ø  迭代器接口Iterator.java

package com.yilong.designpattern.iterator;

public interface Iterator {

 

    public boolean hasNext();

    public Object next();

}

    說明:該接口主要有兩個方法,一個是判斷容器中是否還有下一個元素的hasNext(),另一個是取出容器中下一個元素next()方法。

Ø  實現了Iterator接口的ArrayIterator.java

package com.yilong.designpattern.iterator;

public class ArrayIterator implements Iterator{

    private ArrayList arrayList;

    private int index = 0;

   

    ArrayIterator(ArrayList arrayList) {

       this.arrayList = arrayList;

    }

 

    public boolean hasNext() {

       if(this.index < this.arrayList.size()) {

           return true;

       } else {

           return false;

       }

    }

 

    public Object next() {

       Object obj = arrayList.get(this.index);

       this.index ++;

       return obj;

    }

}

    說明:主要用以對ArrayList容器進行遍歷的iterator類。

Ø  Book.java

package com.yilong.designpattern.iterator;

public class Book {

 

    private String bookName;

   

    public Book(String bookName) {

       this.bookName = bookName;

    }

    public String getBookName() {

       return bookName;

    }

    public void setBookName(String bookName) {

       this.bookName = bookName;

    }

}

Ø  Main.java

package com.yilong.designpattern.iterator;

public class Main {

 

    public static void main(String[] args) {

       Collection objList = new ArrayList();

       objList.add(new Book("《名偵探柯南》"));

       objList.add(new Book("《遊戲王》"));

       objList.add(new Book("《三國演義》"));

       Iterator iterator = objList.iterator();

       while(iterator.hasNext()) {

           Book book = (Book)iterator.next();

           System.out.println(book.getBookName());

       }

    }

}

    該設計模式的UML圖如下:

    說明:JDKIterator與上述的設計原理完全一樣,因此測試的代碼可以直接copy上述的代碼,只需要引入具體的包即可。

Ø  Main.java

package com.yilong.test.jdk.iterator;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Iterator;

 

public class TestIterator {

 

    public static void main(String[] args) {

       Collection  bookShelfs = new ArrayList();

       bookShelfs.add(new Book("福爾摩斯"));

       bookShelfs.add(new Book("名偵探柯南"));

       bookShelfs.add(new Book("遊戲王"));

       System.out.println(bookShelfs.size());

       Iterator bookShelfIterator = bookShelfs.iterator();

       while(bookShelfIterator.hasNext()) {

           Book book = (Book)bookShelfIterator.next();

           System.out.println(book.getName());

       }

      

       ArrayList arrayList = new ArrayList();

       System.out.println(arrayList.get(0));

    }

}

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