Iteratorパターンとは | GoFデザインパターン

記事内に広告が含まれています。

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など、さまざまなプログラミング言語でこのパターンは広く使われており、汎用性の高い設計を実現します。

オブジェクト指向プログラミングにおけるGoFの23のデザインパターン
デザインパターンは、ソフトウェア設計の問題を効果的に解決するための再利用可能な解決策です。本記事では、GoF(Gang ...
【PR】
オブジェクト指向学習におすすめの本
オブジェクト指向
スポンサーリンク
タイトルとURLをコピーしました