1. 程式人生 > >Java設計模式之迭代器模式(Iterator Pattern)

Java設計模式之迭代器模式(Iterator Pattern)

介紹

迭代器模式是一種行為型設計模式,它是我們經常使用的一個設計模式,但是基本上不會單獨寫一個迭代器,大都使用的是 Java 語言內建的迭代器。可以說這是一個融入 Java 語言的設計模式,不止 Java ,其他很多語言都會內建這個模式。下面來看它的定義:

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

它提供一種方法訪問一個容器物件中各個元素,而又不需要暴露該物件的內部細節。

迭代器模式是一個專門服務容器的設計模式。容器只需要負責增刪元素即可,剩下的遍歷操作交給迭代器就可以了。

迭代器模式主要有四個角色:

  • Iterator——抽象迭代器。
    抽象類或介面,定義迭代器的操作。

  • ConcreteInterator——具體迭代器。
    實現抽象迭代器,具體實現其中的各個操作。

  • Aggregate——抽象容器。
    抽象容器需要有一個可以返回迭代器的方法。

  • ConcreteAggregate——具體容器。
    實現抽象容器的方法,創建出容納迭代器的物件。

模板

抽象迭代器:

public interface Iterator {
    //遍歷到下一個元素.
    public Object next();
    //是否已經遍歷到尾部。
    public
boolean hasNext(); //刪除當前指向的元素。 public boolean remove(); }

具體迭代器:

public class ConcreteIterator implements Iterator {
    private Vector<Object> vector = new Vector<>();
    public int cursor = 0;
    public ConcreteIterator(Vector<Object> vector) {
        this.vector = vector;
    }
    @Override
public boolean hasNext() { if (this.cursor == this.vector.size()) { return false; } return true; } @Override public Object next() { Object result = null; if (this.hasNext()) { result = this.vector.get(this.cursor++); } else { result = null; } return result; } @Override public boolean remove() { this.vector.remove(this.cursor); return true; } }

抽象容器:

public interface Aggregate {
    public void add(Object object);
    public void remove(Object object);
    public Iterator iterator();
}

具體容器:

public class ConcreteAggregate implements Aggregate {
    private Vector<Object> vector = new Vector<>();
    @Override
    public void add(Object object) {
        this.vector.add(object);    
    }
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this.vector);
    }
    @Override
    public void remove(Object object) {
        this.remove(object);    
    }
}

場景類:

public class Client {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        aggregate.add("蘋果");
        aggregate.add("橘子");
        aggregate.add("香蕉");
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

輸出結果:

蘋果
橘子
香蕉

總結

簡單地說,迭代器就像一個容器的遊標一樣,可以遍歷容器內部的所有元素

如果沒有語言內建的迭代器,迭代器模式還是挺困難的一個設計模式,但是,由於大部分語言已經含有了這個模式,因此,該模式基本不會單獨出現,我們應該儘量使用語言內建的迭代器,避免自己重新搭建。

相關推薦

Java設計模式模式Iterator Pattern

介紹 迭代器模式是一種行為型設計模式,它是我們經常使用的一個設計模式,但是基本上不會單獨寫一個迭代器,大都使用的是 Java 語言內建的迭代器。可以說這是一個融入 Java 語言的設計模式,不止 Java ,其他很多語言都會內建這個模式。下面來看它的定義:

JAVA設計模式 模式Iterator Pattern

一、概述     提供一種方法來訪問聚合物件(容器container),而不用暴露這個物件的內部細節。屬於物件行為型模式。 二、適用場景     1>遍歷訪問聚合物件中的元素,而無須暴露它的內容表示,將聚合物件的訪問和內部資料的儲存分離。使得訪問聚合物件時無須瞭解

java設計模式模式

## 定義 ## 提供一種方法順序訪問一個聚合物件中的各個元素,而由不需要暴露該物件的內部細節。 ## 程式碼舉例 ## /** * @author bwx * @date 2017/11/29 * 迭代器介面 */ public

Java設計模式模式(五)

迭代器模式:提供一種方法順序訪問一個集合物件中的各個元素,而又不需要暴漏物件的內部表示。 合理組織資料的結構以及相關操作時程式設計的一個重要方面,比如在程式設計中經常會使用諸如連結串列、散列表等資料結構。連結串列和散列表等資料結構都是可以存放若干個物件的集合,其區別時按

16.java設計模式模式

#### 基本需求: * 展示一個學校的結構,比如一個學校下面有多個學院,學院下面有多個系,對其節點主要是遍歷,與組合模式略有不同 #### 傳統方案: * 學校<-學院<-系 依次繼承 * 這種方式,在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系,因此這種方案,不能

設計模式的藝術 行為型模式模式

前言 現在的電視機都配置了一個遙控器,使用者可以通過遙控器去選擇上一個或者下一個臺,我們只需要知道如何使用這個遙控器,而無須關注電視是怎麼把電視訊道放入其中的,在軟體實際的開發中,也有這麼一種類,它儲存著多個成員物件,這些類通常稱為聚合類,對應的物件稱為聚合物件。為了方便操作這些聚合物件,同時可

設計模式模式Iterator

前言: 參考圖書:軟體設計模式與體系結構 參考部落格:https://www.cnblogs.com/wanson/articles/9277813.html   正題:         迭代器(iterator)有時又稱遊標

golang設計模式模式

迭代器模式 定義 wiki: 在 物件導向程式設計裡,迭代器模式是一種設計模式,是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每一個元素而不用瞭解底層的實作。 簡單點說,為一個容器設定一個迭代函式,可以使用這個迭代函式來順序訪問其中的每一個元素,而外部無需知道底層實現

23種設計模式模式

迭代器模式的定義 定義: 它提供一種方法訪問一個容器物件中各個元素, 而又不需暴露該物件的內部細節 其類圖如下:   其中角色: Iterator 抽象迭代器: 抽象迭代器負責定義訪問和遍歷元素的介面, 而且基本上是有固定的三個方法: first()獲得第一個元素, n

Android設計模式模式

迭代器模式又稱遊標模式, 是行為型設計模式之一。迭代器模式源於對容器的訪問,比如Java中的List、Map、陣列等。 對容器物件的訪問必然會涉及到遍歷演算法,可以將遍歷演算法封裝在容器中,或者不提供遍歷演算法。如果將遍歷演算法封裝在容器中,那麼容器類就承擔了過多的功能,容器類不僅要維護自身內部

Python進階:設計模式模式

  在軟體開發領域中,人們經常會用到這一個概念——“設計模式”(design pattern),它是一種針對軟體設計的共性問題而提出的解決方案。在一本聖經級的書籍《設計模式:可複用面向物件軟體的基礎》(1991年,Design Patterns - Elements of Reusable Obj

設計模式模式Iterator Pattern

這篇部落格,我們要詳細講解的是迭代器模式(Iterator Pattern),將要講解的內容有:迭代器模式 的定義,作用,詳細設計分析等方面。 一、Pattern name 迭代器模式(Iterator Pattern) : 提供一種方法

設計模式模式

迭代器模式提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 爆炸性新聞:物件村餐廳和物件村煎餅屋合併了! 真是個好訊息!現在我們可以在同一個地方,享用煎餅屋美味的煎餅早餐,和好吃的餐廳午餐了。但是,好像有一點小麻煩: 新的餐廳想用煎餅屋選單當作

javascript設計模式模式

javascript的迭代器模式實現了一種類似連結串列的迭代器資料結構和相關查詢函式。 程式碼如下: Var agg = (function () { var index = 0, arr = [1,2,3],

C++設計模式模式

提供一種方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。當你需要訪問一個聚集物件,而且不管這些物件是什麼都需要遍 歷的時候,就應該考慮用迭代器模式。同時需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。為遍歷不同的聚集結構提供如開始、下一個、是否結束、

行為型:設計模式模式二十一

 20世紀80年代,那時我家有一臺“古老的”電視機,牌子我忘了,只記得是臺黑白電視機,沒有遙控器,每次開關機或者換臺都需要通過電視機上面的那些按鈕來完成,我印象最深的是那個用來換臺的按鈕,需要親自用手去旋轉(還要使點勁才能擰動),每轉一下就“啪”的響一聲,如果沒有收到任何電視訊道就會出現一片讓人眼花的雪花點。

研磨設計模式 模式Iterator1——跟著cc學設計系列

14.1  場景問題 14.1.1  工資表資料的整合        考慮這樣一個實際應用:整合工資表資料。        這個專案的背景是這樣的,專案的客戶方收購了一家小公司,這家小公司有自己的工資系統,現在需要整合到客戶方已有的工資系統上。        客戶方已有的工

研磨設計模式 模式Iterator2——跟著cc學設計系列

14.2  解決方案 14.2.1  迭代器模式來解決 用來解決上述問題的一個合理的解決方案就是迭代器模式。那麼什麼是迭代器模式呢? (1)迭代器模式定義   所謂聚合是:指一組物件的組合結構,比如:Java中的集合、陣列等。 (2)應用迭代器模式來解決的思路      

java設計模式

本文介紹行為型模式的一種模式——迭代器模式。該模式主要用於對某一物件集合進行遍歷,將物件的資料儲存和遍歷進行分離。在Java語言中有著較高的應用頻率。 1、定義:提供一種方法順序地訪問一個聚合物件中的各個元素而不需要暴露該物件的內部表示。 2、模式結構: (1)Iter

Java進階篇設計模式九----- 直譯器模式模式

前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 直譯器模式(Interpreter Pattern)和迭代器模式