天天看點

23種設計模式--疊代器模式

疊代器模式也是屬于23種常用的設計模式裡面的。這個的使用頻率非常高。

什麼叫疊代器模式?

提供一種方法通路一個容器(container)對象中各個元素,而又不需暴露該對象的内部細節。

怎麼了解這段話?

提供一個方法通路容器?首先要搞明白什麼是容器。我的了解是在java中可以管理一組相同對象,且可以對對象進行增删改查的都可以稱作容器。是以在java 中我認為集合就是一個容器。而且集合都可以被疊代。且集合可以存放對象,那麼如果有個東西可以周遊對象。那麼自然你就能得到每個對象的所有屬性和方法。這個東西非疊代器莫屬。事實上疊代器最常用的就是疊代集合。而且java 自身有疊代器這個類。下面我寫一段周遊map集合的一段程式。

packagecom.fish.iterator;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.Map.Entry;

public class Test {

    public static void main(String[] args) {

        Person person1 = new Person("000001", "張三");

        Person person2 = new Person("000002", "李四");

        Person person3 = new Person("000003", "王五");

        Map<String, Person> map = new HashMap<String, Person>();

        map.put(person1.getId(), person1);

        map.put(person2.getId(), person2);

        map.put(person3.getId(), person3);

//上面我把資料全部放進了map裡面,接着這麼周遊map裡面的資料,接着疊代器就發揮作用了。

首先map放值是以鍵值對存放的,是以要周遊map就必須先獲得一個實體entrySet而這個對象本身有疊代的方法。然後我們通過疊代器來實作一個疊代。

        Iterator<Entry<String,Person>> iterator = map.entrySet().iterator();

        while (iterator.hasNext()) {

     Entry< String, Person>entry=iterator.next();

   System.out.println( entry.getKey()+entry.getValue().getName());

        }

    }

}

結果是

000002李四

000003王五

000001張三

從結果上來我們獲得了map裡面的所有資料,而且map裡面的資料是無序的。

為什麼這段代碼就能進行疊代?

我們看看java本身是這麼寫這個iterator的。我們深入到這個itertor類裡面可以看到有一個接口。這個接口裡面隻有3個方法。當然我們看不到java本身實作這個接口的類。

public interface Iterator<E> {

    boolean hasNext();

    E next();

    void remove();

}

其中hasnext是一個boolean類型,是以可以推斷,這是用來控制循環的。

看到next我首先想到的是連結清單。就是每次往下走一個。也就是如果map在hasnext條件也為真的情況下調用next每次往下走,同時next裡面有個計數器會自增。而這個計數器一定是作為hasnext的一個比較條件。當這個計數器和集合長度一樣就停止。也就hasnxet為flase。

我們可以驗證一下我的猜測,我把代碼這樣寫

    while (iterator.hasNext()) {

//     Entry< String, Person>entry=iterator.next();

//   System.out.println(  entry.getKey()+entry.getValue().getName());

            System.out.println("111");

        }

輸出的結果是死循環,因為沒有往下走條件一直未真。是以next裡面有一個計數器。是以疊代器模式是通過周遊算法來實作的。是以我隻能借住别人的代碼來實作一個疊代器。我寫這個目的是加深了解集合和這種思想的。

繼續閱讀