1. 程式人生 > >JAVA設計模式之 迭代器模式【Iterator Pattern】

JAVA設計模式之 迭代器模式【Iterator Pattern】

一、概述

    提供一種方法來訪問聚合物件(容器container),而不用暴露這個物件的內部細節。屬於物件行為型模式。

二、適用場景

    1>遍歷訪問聚合物件中的元素,而無須暴露它的內容表示,將聚合物件的訪問和內部資料的儲存分離。使得訪問聚合物件時無須瞭解其內部的實現細節。

    2>需要為一個聚合物件提供多種遍歷實現。

三、UML類圖


四、參與者

 1>Iterator(抽象迭代器):它定義了訪問和遍歷元素的介面,聲明瞭用於遍歷資料元素的方法,例如:用於獲取第一個元素的first()方法,用於訪問下一個元素的next()方法,用於判斷是否還有下一個元素的hasNext()方法,用於獲取當前元素的currentItem()方法等,在具體迭代器中將實現這些方法。

 2>ConcreteIterator(具體迭代器):它實現了抽象迭代器介面,完成對聚合物件的遍歷,同時在具體迭代器中通過遊標來記錄在聚合物件中所處的當前位置,在具體實現時,遊標通常是一個表示位置的非負整數。

 3>Aggregate(抽象聚合類):它用於儲存和管理元素物件,宣告一個createIterator()方法用於建立一個迭代器物件,充當抽象迭代器工廠角色。

 4>ConcreteAggregate(具體聚合類):它實現了在抽象聚合類中宣告的createIterator()方法,該方法返回一個與該具體聚合類對應的具體迭代器ConcreteIterator例項。

五、用例學習

1、抽象迭代器 Iterator.java

/**
 * 自定義迭代器介面<br/>
 * <b>說明:</b>
 * 此處沒有使用JDK內建的迭代器介面 java.util.Iterator<E>
 * @author  [email protected]
 *
 */
public interface Iterator {
    /** 將遊標指向第一個元素  */
	public Object first();
	/** 將遊標指向下一個元素  */
	public Object next();
	/** 判斷是否存在下一個元素  */
	public boolean hasNext();
	/** 返回遊標指向的當前元素  */
	public Object currentItem();
}

2、具體迭代器 ConcreteIterator.java

/**
 * 具體迭代器實現類<br/>
 * 訪問聚合物件、對聚合物件內部元素遍歷
 * @author  [email protected]
 *
 */
public class ConcreteIterator implements Iterator {
	// 維持一個對具體聚合物件的引用,以便於訪問儲存在聚合物件中的資料  
	private Aggregate aggregate;
	// 定義一個遊標,用於記錄當前訪問位置  
	private int cursorIndex; 

	public ConcreteIterator(Aggregate aggregate){
		this.aggregate = aggregate;
	}
	
	@Override
	public Object first() {
		cursorIndex = 0;
        return aggregate.getObjects().get(cursorIndex);
	}

	@Override
	public Object next() {
		cursorIndex++ ;
		if(hasNext()){
			return aggregate.getObjects().get(cursorIndex);
		} 
		return aggregate.getObjects().get(0);
	}

	@Override
	public boolean hasNext() {
		if (cursorIndex < aggregate.getObjects().size()) {
			return true;
		}
		return false;
	}

	@Override
	public Object currentItem() {
		return aggregate.getObjects().get(cursorIndex);
	}

}
3、抽象聚合類 Aggregate.java
import java.util.ArrayList;
import java.util.List;

/**
 * 抽象聚合物件
 * @author  [email protected]
 *
 */
public abstract class Aggregate {
	
	/** 建立迭代器  具體建立什麼樣迭代方式的迭代器由具體的子類去實現 */
	public abstract Iterator createIterator();
	
    protected List<Object> objects = new ArrayList<Object>();  
	
	public Aggregate(List objects) {  
        this.objects = objects;  
    } 
	
	public void addObject(Object obj){
		objects.add(obj);
	}
	
	public void deleteObject(Object obj){
		objects.remove(obj);
	}
	
	public List<Object> getObjects(){
		return objects;
	}

}
4、具體聚合類 ConcreteAggregate.java
import java.util.List;

/**
 * 具體聚合物件
 * @author  [email protected]
 *
 */
public class ConcreteAggregate extends Aggregate {

	public ConcreteAggregate(List objects) {
		super(objects);
	}

	/**
	 * 提供工廠方法 建立具體的迭代器例項<br/>
	 * 由迭代器去執行具體的聚合物件的遍歷訪問<br/>
	 * 這樣就將聚合物件的資料儲存 和 對聚合物件元素的訪問進行了分離
	 */
	@Override
	public Iterator createIterator() {
		return new ConcreteIterator(this);
	}

}
5、客戶端測試類 Client.java
import java.util.ArrayList;
import java.util.List;

public class Client {

	public static void main(String[] args){
		List<String> nameList = new ArrayList<String>();
		nameList.add("Java");
		nameList.add("C");
		nameList.add("C++");
		
		// 例項化具體聚合物件 且 建立初始化集合資料
		ConcreteAggregate languageAggregate = new ConcreteAggregate(nameList);
		// 獲取聚合物件關聯的迭代器
		Iterator iterator = languageAggregate.createIterator();
		
		// 通過迭代器訪問聚合物件的內部資料
		String firstLanguage = (String) iterator.first();  // 訪問聚合物件集合中索引為1的元素 
		System.out.println(firstLanguage);
		
		boolean hasNext = iterator.hasNext();
		System.out.println("是否還有下一個元素:" + hasNext);
		
		if(hasNext){
			String nextLanguage = (String) iterator.next(); 
			System.out.println("下一個元素:" + nextLanguage);
		}
	}
	
}
6、執行效果
Java
是否還有下一個元素:true
下一個元素:C

六、其他/擴充套件

Java JDK內建的迭代器:

    說到迭代器模式 給我們的第一聯想就是Java中 我們使用最最頻繁的java.util.Iterator介面啦。

沒錯 他就是JDK中內建的迭代器。public interfaceIterator<E> 對collection進行迭代的迭代器。

    這裡想擴充套件的一個點是:關於介面Iterator的子介面ListIterator<E>的介紹

這個ListIterator子介面 也許我們平時的程式碼中使用的少,那麼他有什麼功能呢?

下面先看兩張截圖<比較比較 答案就在其中>

Iterator API方法:


ListIterator API方法:


從上面兩個截圖分析中我們可以看出Iterator只能進行單向遍歷,而ListIterator可以進行雙向遍歷(向前/向後),且可以在迭代期間修改列表。最後附上一張截圖如下:



相關推薦

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

研磨設計模式 模式Iterator)1——跟著cc學設計系列

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

研磨設計模式 模式Iterator)2——跟著cc學設計系列

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

java設計模式

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

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

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