1. 程式人生 > >迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)

概述

在面向物件的軟體設計中,我們經常會遇到一類集合物件,這類集合物件的內部結構可能有著各種各樣的實現,但是歸結起來,無非有兩點是需要我們去關心的:一是集合內部的資料儲存結構,二是遍歷集合內部的資料。面向物件設計原則中有一條是類的單一職責原則,所以我們要儘可能的去分解這些職責,用不同的類去承擔不同的職責。Iterator模式就是分離了集合物件的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部程式碼透明的訪問集合內部的資料。

意圖

提供一種方法順序訪問一個聚合物件中各個元素, 而又不需暴露該物件的內部表示。[GOF 《設計模式》]

結構圖

Iterator模式結構圖如下:

1  Iterator模式結構圖

生活中的例子

迭代器提供一種方法順序訪問一個集合物件中各個元素,而又不需要暴露該物件的內部表示。在早期的電視機中,一個撥盤用來改變頻道。當改變頻道時,需要手工轉動撥盤移過每一個頻道,而不論這個頻道是否有訊號。現在的電視機,使用[後一個][前一個]按鈕。當按下[後一個]按鈕時,將切換到下一個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對一個頻道的節目不感興趣,那麼可以換下一個頻道,而不需要知道它是幾頻道。

2  使用選頻器做例子的Iterator模式物件圖

Iterator模式解說

在面向物件的軟體設計中,我們經常會遇到一類集合物件,這類集合物件的內部結構可能有著各種各樣的實現,但是歸結起來,無非有兩點是需要我們去關心的:一是集合內部的資料儲存結構,二是遍歷集合內部的資料。面向物件設計原則中有一條是類的單一職責原則,所以我們要儘可能的去分解這些職責,用不同的類去承擔不同的職責。Iterator

模式就是分離了集合物件的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部程式碼透明的訪問集合內部的資料。下面看一個簡單的示意性例子,類結構圖如下:

3 示例程式碼結構圖

首先有一個抽象的聚集,所謂的聚集就是就是資料的集合,可以迴圈去訪問它。它只有一個方法GetIterator()讓子類去實現,用來獲得一個迭代器物件。

/**//// <summary>

/// 抽象聚集

/// </summary>


public interface IList

{
    IIterator GetIterator();
}

抽象的迭代器,它是用來訪問聚集的類,封裝了一些方法,用來把聚集中的資料按順序讀取出來。通常會有MoveNext()

CurrentItem()Fisrt()Next()等幾個方法讓子類去實現。

/**//// <summary>

/// 抽象迭代器

/// </summary>


public interface IIterator
{
    
bool MoveNext();

    Object CurrentItem();

    
void First();

    
void Next();
}

具體的聚集,它實現了抽象聚集中的唯一的方法,同時在裡面儲存了一組資料,這裡我們加上Length屬性和GetElement()方法是為了便於訪問聚集中的資料。

/**//// <summary>

/// 具體聚集

/// </summary>


public class ConcreteList : IList
{
    
int[] list;

    
public ConcreteList()

    
{
        list 
= new int[] 1,2,3,4,5};
    }


    
public IIterator GetIterator()

    
{
        
return new ConcreteIterator(this);
    }


    
public int Length

    
{
        
get return list.Length; }
    }


    
public int GetElement(int index)

    
{
        
return list[index];
    }

}

具體迭代器,實現了抽象迭代器中的四個方法,在它的建構函式中需要接受一個具體聚集型別的引數,在這裡面我們可以根據實際的情況去編寫不同的迭代方式。

/**//// <summary>

/// 具體迭代器

/// </summary>


public class ConcreteIterator : IIterator

{
    
private ConcreteList list;

    
private int index;

    
public ConcreteIterator(ConcreteList list)

    
{
        
this.list = list;

        index 
= 0;
    }


    
public bool MoveNext()

    
{
        
if (index < list.Length)

            
return true;

        
else

            
return false;
    }


    
public Object CurrentItem()

    
{
        
return list.GetElement(index) ;
    }


    
public void First()

    
{
        index 
= 0;
    }


    
public void Next()

    
{
        
if (index < list.Length)

        
{
            index
++;
        }

    }

}

簡單的客戶端程式呼叫:

/**//// <summary>

/// 客戶端程式

/// </summary>


class Program

{
    
static void Main(string[] args)

    
{
        IIterator iterator;

        IList list 
= new ConcreteList();

        iterator 
= list.GetIterator();

        
while (iterator.MoveNext())

        
{
            
int i = (int)iterator.CurrentItem();
            Console.WriteLine(i.ToString());

            iterator.Next();
        }


        Console.Read();

    }


}

一個簡單的迭代器示例就結束了,這裡我們並沒有利用任何的.NET特性,在C#中,實現Iterator模式已經不需要這麼麻煩了,已經C#語言本身就有一些特定的實現,下面會說到。

.NET中的Iterator模式

.NET下實現Iterator模式,對於聚集介面和迭代器介面已經存在了,其中IEnumerator扮演的就是迭代器的角色,它的實現如下:

public interface IEumerator

{
    
object Current
    
{
        
get;
    }


    
bool MoveNext();

    
void Reset();

}

屬性Current返回當前集合中的元素,Reset()方法恢復初始化指向的位置,MoveNext()方法返回值true表示迭代器成功前進到集合中的下一個元素,返回值false表示已經位於集合的末尾。能夠提供元素遍歷的集合物件,在.Net中都實現了IEnumerator介面。

IEnumerable則扮演的就是抽象聚集的角色,只有一個GetEnumerator()方法,如果集合物件需要具備跌代遍歷的功能,就必須實現該介面。

public interface IEnumerable

{
    IEumerator GetEnumerator();
}

下面看一個在.NET1.1下的迭代器例子,Person類是一個可列舉的類。PersonsEnumerator類是一個列舉器類。這個例子來自於,被我簡單的改造了一下。

public class Persons : IEnumerable 


    
public string[] m_Names; 

    
public Persons(params string[] Names) 
    

        m_Names 
= new string[Names.Length]; 

        Names.CopyTo(m_Names,
0); 
    }
 

    
private string this[int index] 
    

        
get 
        

            
return m_Names[index]; 
        }
 

        
set 
        

            m_Names[index] 
= value; 
        }
 
    }


    
public IEnumerator GetEnumerator()
    
{
        
return new PersonsEnumerator(this);
    }

}



public class PersonsEnumerator : IEnumerator
{
    
private int index = -1;

    
private Persons P;

    
public PersonsEnumerator(Persons P)
    
{
        
this.P = P;
    }


    
public bool MoveNext()
    
{
        index
++;

        
return index < P.m_Names.Length;
    }


    
public void Reset()
    
{
        index 
= -1;
    }


    
public object Current
    
{
        
get

        
{
            
return P.m_Names[index];
        }

    }

}
 

來看客戶端程式碼的呼叫:

class Program 

    
static void Main(string[] args) 
    

相關推薦

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

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

我所理解的設計模式C++實現——模式Iterator Pattern

概述:         在現在的電視機中,我們使用[後一個]和[前一個]按鈕可以很方便的換臺,當按下[後一個]按鈕時,將切換到下一個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對一個頻道的節目不感興趣,那麼可以換下一個頻道,而不需要知道它是幾頻道。  

設計模式模式Iterator Pattern

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

設計模式模式Iterator Pattern

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

Java設計模式模式Iterator Pattern

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

14.模式Iterator Pattern

1.定義 提供一種方法訪問一個容器物件中各個元素,而又不暴露該物件的內部細節。 目前是一個沒落的模式,基本上沒人會單獨寫一個迭代器,除非是產品性質的開發。 2.型別 行為類模式 3.類圖 4.迭代器模式的使用場景 迭代器模式是與集合共生共死的,一般來說,我們只要實現一

設計模式(16)——模式Iterator Pattern

一、引言 在上篇博文中分享了我對命令模式的理解,命令模式主要是把行為進行抽象成命令,使得請求者的行為和接受者的行為形成低耦合。在一章中,將介紹一下迭代器模式。下面廢話不多說了,直接進入本博文的主題。 二、迭代器模式的介紹 迭代器是針對集合物件而生的,對於集合物件而言,必然涉

軟體設計模式——模式Iterator Pattern

用途 迭代器模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。 實現 我們將建立一個敘述導航方法的 Iterator 介面和一個返回迭代器的 Container 介面。實現了 Cont

模式Iterator Pattern

概述 在面向物件的軟體設計中,我們經常會遇到一類集合物件,這類集合物件的內部結構可能有著各種各樣的實現,但是歸結起來,無非有兩點是需要我們去關心的:一是集合內部的資料儲存結構,二是遍歷集合內部的資料。面向物件設計原則中有一條是類的單一職責原則,所以我們要儘可能的去分解這些職責,用不同的類去承擔不同的職責。I

設計模式之九:模式Iterator Pattern

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

Java設計模式——模式Iterator Pattern

場景一 描述:週五下午,我正在看技術網站,第六感官發覺有人在身後,扭頭一看,我C,老大站在背後,趕忙站起來, “王經理,你找我?” 我說。 “哦,在看技術呀。有個事情找你談一下,你到我辦公室來一下。” 老大說。 到老大辦公室, “是這樣,剛剛我在看季報,我們每個專案的支出費

第17章 模式Iterator Pattern

概述 在面向物件的軟體設計中,我們經常會遇到一類集合物件,這類集合物件的內部結構可能有著各種各樣的實現,但是歸結起來,無非有兩點是需要我們去關心的:一是集合內部的資料儲存結構,二是遍歷集合內部的資料。面向物件設計原則中有一條是類的單一職責原則,所以我們要儘可能的去分解這些職責,用不同的類去承擔不同的職責。I

設計模式模式Iterator

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

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

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

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

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

17、行為型-模式Iterator

迭代器模式(Iterator Pattern):提供一種方法來訪問聚合物件,而不用暴露這個物件的內部表示,其別名為遊標(Curso

模式java版

迭代器模式的組成部分 Aggregate(抽象聚合類) 它用於儲存和管理元素物件,宣告一個createiterator()方法用於建立一個迭代器物件,充當抽象迭代器工廠角色。   ConcreteAggregate(具體聚合類) 它用於抽象聚合類的子類,實現了在抽象集合類中的宣告的crea

設計模式十九模式行為型

一、簡介(Brief Introduction)        提供一種方法順序訪問一個聚合物件中各個元素,而又不需暴露該物件的內部表示 例子1:電視遙控器的頻道遍歷   二、模式分析(Analysi

JAVA設計模式模式Iterator Pattern

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

Java設計模式--模式Iterator Pattern

          在Java中,因為從JDK 1.2 版本開始增加java.util.Iterator 這個介面,並逐步把Iterator 應用到各個聚集類(Collection)中,我們來看JDK 1.5 的API 幫助檔案,你會看到有一個叫java.util.Iter