迭代器模式

迭代器模式介紹

定義

提供一種方法訪問一個容器中的元素,而又不暴露該對象的內部細節.

使用場景

遍歷一個聚合對象,但是目前,java中有Collection集合,我們可以直接使用.

優點:

迭代一個對象時候,無需修改源代碼.

類圖體現

  • 抽象容器:一個接口,里面有增刪改查的方法名,持有iterator()方法.例如java中的Collection接口.
  • 具體容器:實現抽象容器,實現其中方法,以及重寫iterator方法.例如ArrayList實現List.
  • 抽象迭代器:定義遍歷元素所需要的方法,一般有boolean hasNext(), Object next()方法.
  • 具體迭代器:實現迭代器中的方法.

代碼實現(仿照ArrayList)

1.定義容器Collection,持有抽象迭代器方法Iterator()


public interface Collection<T> {
    
    void  add(T  t);
    
    void remove(T t);
    
    Iterator<T> iterator();
    
    
}

2.定義抽象迭代器Iterator,定義迭代方法

public interface Iterator<T> {
    
    boolean hasNext();
    
    T next();
}

3.定義迭代器MyIterator實現

public  class MyIterator<T> implements Iterator<T> {
    
    private List<T> list=new ArrayList<>();
    
    private int cursor=0;
    
    public MyIterator(ArrayList<T> list) {
        // TODO Auto-generated constructor stub
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return cursor!=list.size();
    }

    @Override
    public T next() {
        // TODO Auto-generated method stub
        T obj=null;
        if(this.hasNext())
        {
            obj=list.get(cursor++);
        }
        return obj;
    }
    
    
}

4.實現具體容器

public class MyArrayList<T> implements Collection<T>{

    public ArrayList<T> list =new ArrayList<>();
    
    @Override
    public void add(T t) {
        // TODO Auto-generated method stub
        list.add(t);
    }

    @Override
    public void remove(T t) {
        // TODO Auto-generated method stub
        list.remove(t);
    }

    @Override
    public Iterator<T> iterator() {
        // TODO Auto-generated method stub
        return new MyIterator<T>(list);
    }
    
    
    

}

5.測試類

public class Test {
    public static void main(String[] args) {
        /**
         * 其實,在collection中的
        ArrayList<String> array=new ArrayList<>();
        array.iterator();
        LinkedList<String> linkedList =new LinkedList<>();
        linkedList.iterator();
        HashSet<String> set=new HashSet<>();
        set.iterator();//內 map.keySet().iterator() d的iterator ,沒有實現
        TreeSet<String> set1=new TreeSet<>();
        set1.iterator();*/
        
        
        
        MyArrayList<String> arrayList=new MyArrayList<>();
        arrayList.add("first");
        arrayList.add("second");
        
        Iterator<String> iterator =arrayList.iterator();
        
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

測試結果

first
second

迭代器在java中的體現

Collection集合框架

迭代器Iterator,是結合容器Collection來用的

集合中迭代器的實現

如果想要迭代器, 就要根據容器實現相應的迭代器. 例如:

        ArrayList<String> array=new ArrayList<>();
        array.iterator();
    
        HashSet<String> set=new HashSet<>();
        set.iterator();//內 map.keySet().iterator() d的iterator ,沒有實現
        

其中,ArrayList的迭代器實現在 他自己的內部類,而HashSet并沒有實現自己的迭代器.


public interface List<E> extends Collection<E> {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator<E> iterator();

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    //內部類迭代器
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

.....
}

總結

迭代器模式,java中,已經有了很好的體現和應用.當涉及到對象的遍歷等操作,我們直接把他們放到集合中即可.沒有必要畫蛇添足,浪費資源.

本次學習,有利于理解java語言的設計,加深對java的理解和應用.每一次學習,都有對java的另一種理解.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容

  • 1 場景問題# 1.1 工資表數據的整合## 考慮這樣一個實際應用:整合工資表數據。 這個項目的背景是這樣的,項目...
    七寸知架構閱讀 2,570評論 0 53
  • 目錄 本文的結構如下: 引言 什么是迭代器模式 模式的結構 典型代碼 代碼示例 優點和缺點 適用環境 模式應用 一...
    w1992wishes閱讀 526評論 0 1
  • 定義 提供一種方式順序訪問一個容器對象中的各個元素,而又不需要暴露該對象的內部結構; 在Java中使用最多的一種模...
    賈里閱讀 260評論 0 0
  • 哈爾濱 零下六度的晚上 自己坐在出租房的地上,吃力的一邊換著床單,一邊看著手機微信有沒有消息。 將近一年沒...
    小再是我的筆名閱讀 295評論 0 0
  • 1、清晨冥想第16天 : 【時間】7:36_8:01 【時長】25分鐘 【狀態】集中注意力在眉心,堅持練習屏氣30...
    簡素七年閱讀 150評論 0 1