在 物件導向程式設計裡，**迭代器模式**是一種設計模式，是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每一個元素而不用了解底層的實作。

此外，也可以實作特定目的版本的迭代器。

介面
--

《設計模式》建議合理的介面該要有：

```
public interface Iterator
{
 public Object First();
 public Object Next();
 public boolean isDone();
 public Object CurrentItem();
}

```

示例
--

### Java

```
interface Iterator{
 Object First();
 Object Next();
 boolean IsDone();
 Object CurrentItem();
}

abstract class Aggregate{
 abstract Iterator CreateIterator();
}

class ConcreteIterator implements Iterator{
 private List<Object> list = new ArrayList<Object>();
 private int curr=0;
 public ConcreteIterator(List<Object> list){
 this.list = list;
 }

 public Object First(){
 return list.get(0);
 }

 public Object Next(){
 Object ret = null;
 curr++;
 if(curr < list.size()){
 ret = list.get(curr);
 }
 return ret;
 }

 public boolean IsDone(){
 return curr>=list.size()?true:false;
 }

 public Object CurrentItem(){
 return list.get(curr);
 }
}

class ConcreteAggregate extends Aggregate{
 private List<Object> list = new ArrayList<Object>();
 public ConcreteAggregate(List<Object> list){
 this.list = list;
 }
 public Iterator CreateIterator(){
 return new ConcreteIterator(list);
 }
}

class client{
 public static void main(String[] args){
 List<Object> list = new ArrayList<Object>();
 list.add("miner");
 list.add("any");
 Aggregate agg = new ConcreteAggregate(list);
 Iterator iterator = agg.CreateIterator();
 iterator.First();
 while(!iterator.IsDone()){
 System.out.println(iterator.CurrentItem());
 iterator.Next();
 }
 }
}

```

### C++

### Python

在 Python 中，迭代器是遵循*迭代協議*的物件。使用者可以使用 `iter()` 以從任何序列得到迭代器（如 list, tuple, dictionary, set 等）。另一個方法則是建立一個另一種形式的迭代器 —— generator 。要取得下一個元素，則使用成員函式 next()（Python 2）或函數 next() function （Python 3） 。當沒有元素時，則引發 `StopIteration` 此例外。若要實作自己的迭代器，則只要實作 `next()`（Python 2）或 `__next__()`（ Python 3）。

以下為兩個例子：

```
# 從序列得到
x = [42, "test", -12.34]
it = iter(x)
try:
  while True:
    x = next(it) # 在 Python 2 中，要改成 it.next()
    print x
except StopIteration:
  pass

# generator
def foo(n):
  for i in range(n):
    yield i

it = foo(5)
try:
  while True:
    x = next(it) # 在 Python 2 中，要改成 it.next()
    print x
except StopIteration:
  pass

```

### C#/Visual Basic

For Each…Next(Visual Basic)或者foreach(C#)循环语句，将调用迭代器遍历一个序列，每次获取一个返回值。

迭代器可以作为一个方法或属性的get访问器，其中的Yield (Visual Basic)或yield return (C#)语句返回迭代器的返回值，并记住当前执行的位置。下次再调用迭代器，从该执行位置恢复执行，直至迭代器代码执行完或者遇到Exit Function或Return语句(Visual Basic)或yield break语句(C#) 。编译器把迭代器作为一个状态机的类。 

```
Sub Main()
 Dim days As New DaysOfTheWeek()
 For Each day As String In days
 Console.Write(day & "")
 Next 
 ' Output: Sun Mon Tue Wed Thu Fri Sat
 Console.ReadKey()
End Sub 

Private Class DaysOfTheWeek
 Implements IEnumerable

 Public days =
 New String() {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}

 Public Iterator Function GetEnumerator() As IEnumerator _
 Implements IEnumerable.GetEnumerator

 ' Yield each day of the week. 
 For i As Integer = 0 To days.Length - 1
 Yield days(i)
 Next 
 End Function 
End Class

```

問題
--

* 在巡訪過程中，容器可能會被外部改變。譬如新增或刪除一個元素。

另見
--

* 設計模式
* 迭代器
* 組合模式

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
软件设计模式 |
| --- |
|  |
| 设计模式 | 

|  |  |
| --- | --- |
| 创建型 | 
* 抽象工厂
* 生成器
* 工厂方法
* 惰性初始
* 原型
* 单例

 |
|  |
| 结构型 | 
* 适配器
* 桥接
* Composite（英语：）
* 修饰
* 外观
* 享元
* 代理

 |
|  |
| 行为型 | 
* 责任链
* 命令
* Interpreter（英语：）
* 迭代器
* 中介者
* Memento（英语：）
* 观察者
* Specification（英语：）
* State（英语：）
* 策略
* 模板方法
* 访问者

 |

 |
|  |
| 并行模式 | 
* 主动对象（英语：）
* 阻止（英语：）
* Binding properties（英语：）
* 双重检查锁定模式
* 异步方法调用
* Future与promise
* Guarded suspension（英语：）
* Join（英语：）
* 锁
* Messaging（英语：）
* 监视器
* Proactor（英语：）
* 反应器
* 读写锁
* 调度
* 线程池
* 线程局部存储

 |
|  |
| 架构模式 | 
* ADR（英语：）
* 主动记录
* Broker（英语：）
* 主從式架構
* cbd
* DAO
* DDD
* Data transfer object（英语：）
* Front controller（英语：）
* Identity map（英语：）
* Interceptor（英语：）
* 控制反转
* MVC
* 微服務
* MVP
* 單體式應用程式
* 多层架构
* *n*-tier（英语：）
* Naked objects（英语：）
* P2P
* 发布/订阅
* REST
* SOA
* Specification（英语：）

 |
|  |
| 云分布式 | 
* 断路器
* CQRS（英语：）
* 补偿交易（英语：）
* 索引表
* 领导者选举（英语：）
* MapReduce
* 物化视图（英语：）
* 管道
* 过滤器（英语：）
* 发布/订阅
* 分片（英语：）
* 节流（英语：）

 |
|  |
| 其他模式 | 
* Blackboard（英语：）
* Business delegate（英语：）
* Composite entity（英语：）
* 委托
* 依赖注入
* Intercepting filter（英语：）
* 惰性載入
* Method chaining（英语：）
* 模拟对象
* 空对象
* 对象池
* Servant（英语：）
* Twin（英语：）
* Type tunnel（英语：）

 |
|  |
| 书籍 | 
* 设计模式：可复用面向对象软件的基础
* 企业集成模式（英语：）

 |
|  |
| 人物 | 
* 克里斯托佛·亚历山大
* 埃里希·伽瑪
* Ralph Johnson（英语：）
* John Vlissides（英语：）
* 葛來迪·布區
* 肯特·貝克
* 沃德·坎宁安
* 马丁·福勒
* Robert Martin（英语：）
* Jim Coplien（英语：）
* Douglas Schmidt（英语：）
* Linda Rising

 |
|  |
| 社区 | 
* The Hillside Group（英语：）
* The Portland Pattern Repository（英语：）

 |

 |