**定義:**迭代器模式(IteratorPattern),提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。
類型:對象行為型模式
**概述:** ? ?
正如定義所言,迭代器是為解決更好的訪問一個聚合對象中的各個元素而產生的。迭代器是對象行為模式,也即它主要是通過將對象中的訪問行為提取出來作為迭代器類。迭代器的產生,主要是為了解決客戶端對聚合對象內部元素訪問時可能造成的耦合。
????????為了使得迭代器能夠訪問更多的聚合對象,所以需要面向接口編程,即為迭代器和聚合對象分別提供統一接口。
???????? C++中的STL庫、C#,Java的泛型類型都有封裝迭代器,所以下面的示例重點了解迭代器的工作原理。
????????舉一個簡單示例,有一個圖書館,存有許多圖書。一天,有讀者來借書,這個時候就可以使用迭代器模式了。迭代器將一系列圖書的遍歷查找定位等操作抽象出來形成一個迭代器類。
類圖:

參與者:
1. Client,生成具體的NationalLibrary以及具體的ConcreteIterator對象。
1. Library,提供聚合對象的抽象接口。
1. NationalLibrary,實現接口,并返回一個ConcreteIterator的對象。
1. Iterator,迭代器接口類。
1. ConcreteIterator,完成接口實現遍歷查找。
示例代碼:
~~~
using System;
using System.Collections.Generic;
using System.Text;
namespace IteratorSpace
{
class Program
{
abstract class Library
{
public abstract Iterator CreateIterator();
}
class NationalLibrary : Library
{
private IList<object> items = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
public int Count
{
get { return items.Count; }
}
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool End();
public abstract object CurrentItem();
}
class ConcreteIterator : Iterator
{
private NationalLibrary library;
private int current = 0;
public ConcreteIterator(NationalLibrary _library)
{
this.library = _library;
}
public override object First()
{
return library[0];
}
public override object Next()
{
object ret = null;
current++;
if (current < library.Count)
{
ret = library[current];
}
return ret;
}
public override object CurrentItem()
{
return library[current];
}
public override bool End()
{
return current >= library.Count ? true : false;
}
}
static void Main(string[] args)
{
NationalLibrary library = new NationalLibrary();
library[0] = "C++ Primer";
library[1] = "C Program";
library[2] = "Design Pattern";
Iterator iter = new ConcreteIterator(library);
while (!iter.End())
{
Console.WriteLine("This book is {0}!", iter.CurrentItem());
iter.Next();
}
}
}
}
~~~
適用性:
1. 訪問一個聚合對象的內容而無需暴露它的內部表示。
1. 支持對聚合對象的多種遍歷。
1. 為遍歷不同的聚合結構提供一個統一的接口(即,支持多態迭代)
優缺點:
1. 優點,簡化遍歷過程,降低客戶端與聚合對象之間的耦合性。
1. 缺點,如果是簡單聚合對象使用迭代器反倒復雜,另外新添聚合類以及迭代器類過多時,也會造成類過多而復雜
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《大話設計模式》
1. 《Head?First設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結