1. 程式人生 > >Java描述設計模式(13):迭代器模式

Java描述設計模式(13):迭代器模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、迭代器模式

1、基礎概念

迭代器模式又叫遊標模式,是物件的行為模式。迭代器模式可以順序地訪問一個聚集中的元素而不必暴露聚集的內部表象。

2、模式圖解

3、核心角色

  • Iterator:迭代器角色

此抽象角色定義出遍歷元素所需的介面。

  • ConcreteIterator:具體迭代器角色

此角色實現了Iterator介面,並保持迭代過程中的遊標位置。

  • Aggregate:聚集角色

此抽象角色給出建立迭代器(Iterator)物件的介面。

  • ConcreteAggregate:具體聚集角色

聚合持有物件集合,提供返回迭代器的方法,可以正確遍歷該集合。

  • Client:客戶端角色

持有對聚集及其迭代器物件的引用,呼叫迭代器物件的迭代介面。

4、原始碼案例

public class C02_Iterator {
    public static void main(String[] args) {
        Object[] objArray = {"one","two","three","four","five"};
        Aggregate aggregate = new ConcreteAggregate(objArray);
        Iterator iterator = aggregate.createIterator();
        while (!iterator.isEnd()){
            System.out.println(iterator.currentItem());
            iterator.next();
        }
    }
}
interface Iterator {
    void first();
    void next();
    boolean isEnd();
    Object currentItem();
}
class ConcreteIterator implements Iterator{
    //持有被迭代的聚合物件
    private ConcreteAggregate agg;
    //記錄當前迭代索引位置
    private int index = 0;
    //設定當前聚集物件的大小
    private int size = 0;
    public ConcreteIterator (ConcreteAggregate agg){
        this.agg = agg;
        this.size = agg.getSize();
        index = 0;
    }
    @Override
    public void first() {
        index = 0;
    }
    @Override
    public void next() {
        if (index<size){
            index++;
        }
    }
    @Override
    public boolean isEnd() {
        return (index>=size);
    }
    @Override
    public Object currentItem() {
        return agg.getElement(index);
    }
}
abstract class Aggregate {
    // 建立相應迭代器物件的介面
    public abstract Iterator createIterator();
}
class ConcreteAggregate extends Aggregate{
    private Object[] objArray = null;
    public ConcreteAggregate (Object[] objArray){
        this.objArray = objArray;
    }
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
    public Object getElement (int index){
        if (index<objArray.length){
            return objArray[index];
        } else {
            return null;
        }
    }
    public int getSize (){
        return objArray.length;
    }
}

二、JDK集合應用

1、簡單案例

public class C02_ArrayList {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>() ;
        stringList.add("One") ;
        stringList.add("Two") ;
        stringList.add("Three") ;
        java.util.Iterator<String> itr = stringList.iterator() ;
        while (itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

2、Iterator原始碼

規定了集合迭代的一些方法。

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

3、ArrayList原始碼

  • 實現聚合介面List
ArrayList<E> extends AbstractList<E> implements List<E>
  • 內部迭代器介面實現
private class Itr implements Iterator<E> {
    int cursor;
    int lastRet = -1;
    int expectedModCount = modCount;
    Itr() {}
    public boolean hasNext() {}
    public E next() {}
    public void remove() {}
    public void forEachRemaining(Consumer<? super E> consumer) {}
    final void checkForComodification() {}
}
  • 返回迭代器
public Iterator<E> iterator() {
    return new Itr();
}

三、迭代器總結

1、適用場景

迭代器模式是與集合繫結,只要使用集合,就需要同時這個集合的迭代器,以此遍歷集合中的資料,java中的容器物件Collection,List、Set、Map都有自己的迭代器。容器物件在程式語言中十分核心,所以在實現容器的時候基本都有匹配的迭代器,可以滿足開發的需要,所以迭代器的自定義實踐場景比較少。

2、優點總結

簡化集合遍歷方式,每一個聚集物件都可以有一個或多個迭代器物件,每一個迭代器的迭代狀態可以是彼此獨立的。遍歷演算法被封裝在迭代器角色裡面,因此迭代的演算法可以獨立於聚集角色變化。

四、原始碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

相關推薦

Java描述設計模式(13)模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、迭代器模式 1、基礎概念 迭代器模式又叫遊標模式,是物件的行為

JAVA設計模式(15)模式

迭代器模式是Java和.Net程式設計環境中非常常用的設計模式。此模式用於以順序方式訪問集合物件的元素,而不需要知道其底層表示。迭代器模式屬於行為模式類別。 實現例項 在這個例項中,將建立一個Iterator介面,它陳述了一個導航方法和一個Container介面,以及返回迭代器。 實現Con

Java設計模式(十)設計模式

1.應用場景 (1)訪問一個聚合物件的內容而無需暴露它的內部表示 (2)支援對聚合物件的多種遍歷 (3)為遍歷不同的聚合結構提供一個統一的介面 2.概念 提供一種順序訪問聚合物件元素的方法,並且不暴露聚合物件的內部表示。這個模式給使用者提供了一種方法,可以順序訪問一個聚集

c++設計模式模式(Iterator Pattern)

定義:迭代器模式提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 場景:我們有兩個聚合A和B,有一個聚合管理的類,包含聚合A和B,而這個管理類的功能就是依次遍歷它所包含的聚合中的元素並列印到控制檯上。每個聚合中的元素存放的方式是不同的,有的用的是陣

設計模式模式(Iterator Pattern)

/** * 迭代器模式。 * @author Bright Lee */ public class IteratorPattern { public static void main(String[] args) { String[] strings = new String[

設計模式之三模式

1. 前言        迭代器模式(Iterator)提供了一種方法,它可以順序訪問一個物件當中的各個元素,但是又不暴露這個聚合物件的內部標示。聽起來和遍歷很像,個人感覺就是遍歷,即是,迭代器提供了一個方法,可以順序物件內部的某個容器,而不用知道容器中存放的是什麼型別.在

Go語言設計模式實踐(Iterator)

關於本系列 決定開個新坑。 這個系列首先是關於Go語言實踐的。在專案中實際使用Go語言也有段時間了,一個體會就是不論是官方文件、圖書還是網路資料,關於Go語言慣用法(idiom)的介紹都比較少,基本只能靠看標準庫原始碼自己琢磨,所以我特別想在這方面有一些收集和總結。 然後這個系列也是關於設計模式的。雖然G

設計模式之九模式(Iterator Pattern)

GOF 在《設計模式》:提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露該物件的內部表示。 迭代器模式 是物件行為模式。 聚合:是指一組物件的組合結構,比如:java 中的集合,陣列等。思想:迭代模式的關鍵思想就是把聚合物件的遍歷個訪問從聚合物件中分離出來,放入單

設計模式大總結(五)模式

前言 說到迭代器,所有的Java開發者都不陌生,例如HashSet,當我們需要遍歷HashSet的時候,通過iterator不停的next就可以迴圈遍歷集合中的所有元素。但是這麼做到底有什麼好處呢? 1、使用者不需要關心HashSet內部的實現,不關心

Python全棧學習筆記day 13、生成器

一、迭代器 字串、列表、元組、字典、集合都可以被for迴圈,說明他們都是可迭代的。 print(dir([])) #告訴我列表擁有的所有方法 ret = set(dir([]))&s

設計模式篇之模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。 迭代器模式屬於行為型模式

Php設計模式之【模式Iterator Pattern】

概述 迭代器(Iterator)模式,又叫做遊標(Cursor)模式。GOF給出的定義為:提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。 案例 黑棗電視公司的在生產的電視機,使用遙控器[後一個]和[前一個]按鈕調節頻道。當按下[

java 開發模式之十 : 模式

原理或定義 迭代器模式又叫做遊標(Cursor)模式。GOF給出的定義:提供一種方法訪問一個容器(container)物件中的各個元素,而又不暴露該物件的內部細節。 結構 迭代器角色(Iterator): 負責定義訪問和遍歷元素的介面。具體迭代器角色(Concrete It

設計模式-行為型-模式

迭代器模式(Iterator):   迭代器模式允許你訪問一個數據項序列中的所有元素,而無須關心序列是什麼型別(陣列、連結串列、列表或任何其他型別)。它能有效地構建一個數據管道,經過一系列不同的轉換或過濾後再從管道的另一端出來。迭代器模式就是提供一種遍歷集合元素的統一介面,用一致的方法遍歷集合元素,不需要知

設計模式系列之模式(Iterator Pattern)——遍歷聚合物件中的元素

模式概述 模式定義 模式結構圖 模式虛擬碼 模式改進 模式應用 模式在JDK中的應用 模式在開源專案中的應用 模式總結 說明:設計模式系列文章是讀劉偉所著《設計模式的藝術之道(軟體開發人員內功修煉之道)》一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的部

Java設計模式(十六)之行為型模式模式

一、定義: 迭代器模式,就是提供一種方法訪問一個集合物件中的各個元素,而不暴露其內部的表示。在實際的開發過程中,我們可能需要針對不同的需求,可能需要以不同的方式來遍歷整個整合物件,但是我們不希望在聚合物件的抽象介面層中充斥著各種不同的遍歷操作。這個時候我們就需要這樣一種東西

重學 Java 設計模式實戰模式「模擬公司組織架構樹結構關係,深度遍歷人員資訊輸出場景」

![](https://img-blog.csdnimg.cn/20200623234005361.png) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) - `原創系列專題文章` >沉澱、分享、成長,讓自己和他人都能有所收穫!

「補課」進行時設計模式(13)——模式

![](https://cdn.geekdigging.com/DesignPatterns/java_design_pattern.jpg) ## 1. 前文彙總 [「補課」進行時:設計模式系列](https://www.geekdigging.com/category/%e8%ae%be%e8%ae%

23種設計模式13模式

關系 想象 遍歷集合 spa 意思 比較 使用 string 對象方法 定義:提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內部細節。 類型:行為類模式。 類圖: 如果要問java中使用最多的一種模式,答案不是單例模式,也不是工廠模式,更不是策略模式,而是

重走Java設計模式——模式(Iterator Pattern)

迭代器模式 定義 提供一種方法順序訪問一個聚合物件中各個元素, 而又無須暴露該物件的內部表示。 模式結構 1.抽象容器:一般是一個介面,提供一個iterator()方法,例如java中的Collection介面,List介面,Set介面等。 2.具體