Iteratorパターンは、コレクションの要素に順にアクセスするためのデザインパターンです。
GoF(Gang of Four)の23のデザインパターンの一つとして知られており、Java、C++、C#、VB.NETなど多くのプログラミング言語で活用されています。
このページでは、Iteratorパターンの基本的な概念と使い方、そして実装サンプルを紹介します。
特に、Java、C++、C#、VB.NETのそれぞれでのサンプルコードを掲載し、各言語での実装方法を解説します。
Iteratorパターンとは
Iteratorパターンは、コレクション要素にアクセスする方法を提供し、要素の順序を外部から隠蔽します。
このパターンは、異なる種類のコレクション(リスト、セット、マップなど)で共通のインターフェースを通じて要素を巡回できるようにするために使用されます。
Iteratorパターンの目的
Iteratorパターンの目的は、コレクションの実装に依存しない形でその要素を順次アクセスする方法を提供することです。
これにより、例えば、リストや配列、ハッシュテーブルといった異なるコレクションの構造を意識せずに、統一された方法で要素にアクセスできます。
Iteratorパターンの使い方
Iteratorパターンの使用方法は非常にシンプルです。基本的には「次の要素が存在するかどうか」「現在の要素を返す」「次の要素に移動する」といった操作をサポートするIteratorインターフェースを実装します。
これにより、コレクション内部のデータ構造を意識せずに、要素を順次処理することが可能になります。
Iteratorインターフェース
Iteratorパターンの中心となるのが、次のメソッドを持つインターフェースです。
- hasNext(): 次の要素がある場合はtrueを返す。
- next(): 次の要素を返し、内部的なカウンタを進める。
以下の実装サンプルでは、Java、C++、C#、VB.NETでのIteratorパターンの使用方法を紹介します。
Iteratorパターン実装サンプル
JavaでのIteratorパターンの実装
import java.util.Iterator;
import java.util.ArrayList;
class CustomCollection implements Iterable {
private ArrayList items = new ArrayList<>();
public void add(T item) {
items.add(item);
}
@Override
public Iterator iterator() {
return items.iterator();
}
}
public class Main {
public static void main(String[] args) {
CustomCollection collection = new CustomCollection<>();
collection.add("Item 1");
collection.add("Item 2");
collection.add("Item 3");
for (String item : collection) {
System.out.println(item);
}
}
}
C++でのIteratorパターンの実装
#include
#include
template
class CustomCollection {
public:
void add(T item) {
items.push_back(item);
}
typename std::vector::iterator begin() {
return items.begin();
}
typename std::vector::iterator end() {
return items.end();
}
private:
std::vector items;
};
int main() {
CustomCollection collection;
collection.add("Item 1");
collection.add("Item 2");
collection.add("Item 3");
for (auto it = collection.begin(); it != collection.end(); ++it) {
std::cout << *it << std::endl;
}
return 0;
}
C#でのIteratorパターンの実装
using System;
using System.Collections;
using System.Collections.Generic;
class CustomCollection : IEnumerable {
private List items = new List();
public void Add(T item) {
items.Add(item);
}
public IEnumerator GetEnumerator() {
return items.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
}
class Program {
static void Main(string[] args) {
CustomCollection collection = new CustomCollection();
collection.Add("Item 1");
collection.Add("Item 2");
collection.Add("Item 3");
foreach (string item in collection) {
Console.WriteLine(item);
}
}
}
VB.NETでのIteratorパターンの実装
Imports System
Imports System.Collections
Imports System.Collections.Generic
Class CustomCollection(Of T)
Implements IEnumerable(Of T)
Private items As New List(Of T)()
Public Sub Add(item As T)
items.Add(item)
End Sub
Public Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
Return items.GetEnumerator()
End Function
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return Me.GetEnumerator()
End Function
End Class
Module Module1
Sub Main()
Dim collection As New CustomCollection(Of String)()
collection.Add("Item 1")
collection.Add("Item 2")
collection.Add("Item 3")
For Each item As String In collection
Console.WriteLine(item)
Next
End Sub
End Module
まとめ
Iteratorパターンは、コレクション内の要素に順にアクセスするための効率的でシンプルな方法を提供します。
このパターンを使用することで、コレクションの実装に依存せず、共通のインターフェースを通じて要素を巡回できるため、コードの再利用性や保守性が向上します。
Java、C++、C#、VB.NETなど、さまざまなプログラミング言語でこのパターンは広く使われており、汎用性の高い設計を実現します。