最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式中的迭代器模式詳解

 更新時間:2023年02月08日 09:52:11   作者:低調(diào)函數(shù)  
迭代器模式官方解釋就是提供一個對象來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。何為聚合對象呢?最典型的就是集合類。大白話也就是,集合中的數(shù)據(jù)是私有的,集合中不應(yīng)該提供直接遍歷的方法,要定義一個新的對象用于訪問這個集合

一 定義

提供一個對象來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。

二 UML類圖

  • 抽象聚合(Aggregate)角色:定義存儲、添加、刪除聚合元素以及創(chuàng)建迭代器對象的接口。
  • 具體聚合(ConcreteAggregate)角色:實現(xiàn)抽象聚合類,返回一個具體迭代器的實例。
  • 抽象迭代器(Iterator)角色:定義訪問和遍歷聚合元素的接口,通常包含 hasNext()、next() 等方法。
  • 具體迭代器(Concretelterator)角色:實現(xiàn)抽象迭代器接口中所定義的方法,完成對聚合對象的遍歷,記錄遍歷的當前位置。

三 代碼實例

【例】定義一個可以存儲學(xué)生對象的容器對象,將遍歷該容器的功能交由迭代器實現(xiàn),涉及到的類如下:

定義迭代器接口,聲明hasNext、next方法:

public interface StudentIterator {
    boolean hasNext();
    Student next();
}

定義具體的迭代器類,重寫所有的抽象方法”

public class StudentIteratorImpl implements StudentIterator {
    private List<Student> list;
    private int position = 0;
    public StudentIteratorImpl(List<Student> list) {
        this.list = list;
    }
    @Override
    public boolean hasNext() {
        return position < list.size();
    }
    @Override
    public Student next() {
        Student currentStudent = list.get(position);
        position ++;
        return currentStudent;
    }
}

定義抽象容器類,包含添加元素,刪除元素,獲取迭代器對象的方法:

public interface StudentAggregate {
    void addStudent(Student student);
    void removeStudent(Student student);
    StudentIterator getStudentIterator();
}

定義具體的容器類,重寫所有的方法:

public class StudentAggregateImpl implements StudentAggregate {
    private List<Student> list = new ArrayList<Student>();  // 學(xué)生列表
    @Override
    public void addStudent(Student student) {
        this.list.add(student);
    }
    @Override
    public void removeStudent(Student student) {
        this.list.remove(student);
    }
    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(list);
    }
}

四 迭代器模式的優(yōu)缺點

4.1 優(yōu)點

  • 它支持以不同的方式遍歷一個聚合對象,在同一個聚合對象上可以定義多種遍歷方式。在迭代器模式中只需要用一個不同的迭代器來替換原有迭代器即可改變遍歷算法,我們也可以自己定義迭代器的子類以支持新的遍歷方式。
  • 迭代器簡化了聚合類。由于引入了迭代器,在原有的聚合對象中不需要再自行提供數(shù)據(jù)遍歷等方法,這樣可以簡化聚合類的設(shè)計。
  • 在迭代器模式中,由于引入了抽象層,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,滿足 “開閉原則” 的要求。

4.2 缺點

增加了類的個數(shù),這在一定程度上增加了系統(tǒng)的復(fù)雜性。

五 使用場景

  • 當需要為聚合對象提供多種遍歷方式時。
  • 當需要為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口時。
  • 當訪問一個聚合對象的內(nèi)容而無須暴露其內(nèi)部細節(jié)的表示時。

六 JDK迭代器的運用

迭代器模式在JAVA的很多集合類中被廣泛應(yīng)用,接下來看看JAVA源碼中是如何使用迭代器模式的。

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator(); //list.iterator()方法返回的肯定是Iterator接口的子實現(xiàn)類對象
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

看完這段代碼是不是很熟悉,與我們上面代碼基本類似。單列集合都使用到了迭代器,我們以ArrayList舉例來說明

  • List:抽象聚合類
  • ArrayList:具體的聚合類
  • Iterator:抽象迭代器
  • list.iterator():返回的是實現(xiàn)了 Iterator 接口的具體迭代器對象

具體的來看看 ArrayList的代碼實現(xiàn)

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
    public Iterator<E> iterator() {
        return new ArrayList.Itr();
    }
    private class Itr implements Iterator<E> {
        int cursor;       // 下一個要返回元素的索引
        int lastRet = -1; // 上一個返回元素的索引
        int expectedModCount = modCount;
        Itr() {}
        //判斷是否還有元素
        public boolean hasNext() {
            return cursor != size;
        }
        //獲取下一個元素
        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];
        }
        ...
    }
}

這部分代碼還是比較簡單,大致就是在 iterator 方法中返回了一個實例化的 Iterator 對象。Itr是一個內(nèi)部類,它實現(xiàn)了 Iterator 接口并重寫了其中的抽象方法。

注意:

當我們在使用JAVA開發(fā)的時候,想使用迭代器模式的話,只要讓我們自己定義的容器類實現(xiàn)java.util.Iterable并實現(xiàn)其中的iterator()方法使其返回一個 java.util.Iterator 的實現(xiàn)類就可以了

到此這篇關(guān)于Java設(shè)計模式中的迭代器模式詳解的文章就介紹到這了,更多相關(guān)Java迭代器模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA Future類的使用詳解

    JAVA Future類的使用詳解

    這篇文章主要介紹了JAVA Future類的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • AsyncConfigurerSupport自定義異步線程池處理異常

    AsyncConfigurerSupport自定義異步線程池處理異常

    這篇文章主要為大家介紹了AsyncConfigurerSupport自定義異步線程池處理異常詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • java 防盜鏈詳解及解決辦法

    java 防盜鏈詳解及解決辦法

    這篇文章主要介紹了 java 防盜鏈詳解及解決辦法的相關(guān)資料,這里介紹了防盜鏈的概念、產(chǎn)生原因及Http中的referer,最后介紹解決辦法,需要的朋友可以參考下
    2017-07-07
  • java實現(xiàn)從網(wǎng)絡(luò)下載多個文件

    java實現(xiàn)從網(wǎng)絡(luò)下載多個文件

    這篇文章主要為大家詳細介紹了java實現(xiàn)從網(wǎng)絡(luò)下載多個文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java中的注解詳解(Annotation)

    Java中的注解詳解(Annotation)

    文章介紹了Java中的注解,包括注解的定義、元注解、Java內(nèi)置的三大注解、自定義注解、反射注解以及注解的作用,注解是一種特殊的標記,可以用于類、方法、字段等元素,用于提供元數(shù)據(jù)信息
    2025-03-03
  • SpringMVC實現(xiàn)Controller的三種方式總結(jié)

    SpringMVC實現(xiàn)Controller的三種方式總結(jié)

    這篇文章主要介紹了SpringMVC實現(xiàn)Controller的三種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java service層獲取HttpServletRequest工具類的方法

    Java service層獲取HttpServletRequest工具類的方法

    今天小編就為大家分享一篇關(guān)于Java service層獲取HttpServletRequest工具類的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Maven的生命周期與自定義插件實現(xiàn)方法

    Maven的生命周期與自定義插件實現(xiàn)方法

    Maven的生命周期就是對所有的構(gòu)建過程進行抽象和統(tǒng)一。包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有的構(gòu)建步驟
    2022-12-12
  • Java中static變量作用和用法詳解

    Java中static變量作用和用法詳解

    Java 中被 static 修飾的成員稱為靜態(tài)成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態(tài)成員可以使用類名直接訪問,也可以使用對象名進行訪問.下面我們來詳細了解一下吧
    2019-06-06
  • Java中檢查字符串是否以特定字符結(jié)尾

    Java中檢查字符串是否以特定字符結(jié)尾

    這篇文章主要介紹了Java中檢查字符串是否以特定字符結(jié)尾,文章圍繞主題展開字符串匹配問題,具有一定的參考價值需要的小伙伴可以參考一下
    2022-06-06

最新評論

新野县| 翼城县| 镇江市| 赣州市| 东方市| 汝州市| 泰州市| 济源市| 新野县| 新郑市| 简阳市| 大埔区| 仪征市| 秦皇岛市| 改则县| 南部县| 简阳市| 蕉岭县| 安顺市| 华池县| 陇川县| 蒲城县| 汉源县| 安化县| 岱山县| 江川县| 石首市| 奉新县| 万荣县| 河南省| 呼玛县| 武山县| 平乐县| 大安市| 天柱县| 多伦县| 金阳县| 赤峰市| 海南省| 寿阳县| 神农架林区|