Iteratorパターンとは、コレクションの要素を順番にアクセスする方法を提供するデザインパターンだ。これにより、コレクションの内部構造を意識せずに、要素を一つずつ取り出せる。
たとえば、ゲームの中で持っているアイテムを一つずつ順番に表示するような場面で役立つ。
では、サンプルコードを一緒に見ていこう。
たとえば、図書館の本を順番に1冊ずつ取り出して読む、というような動作をイメージしてくれ。
まず、コレクションを用意しよう。コレクションは、順番に処理したいデータ(たとえば、絵本のリスト)を持つものだ。
// 絵本のコレクション
class BookCollection {
constructor() {
this.books = []; // 絵本のリスト
}
addBook(book) {
this.books.push(book); // 絵本を追加するメソッド
}
getBooks() {
return this.books; // 絵本のリストを返すメソッド
}
}
次に、このコレクションの中の絵本を1冊ずつ取り出すための「Iterator」を作ろう。Iteratorは、リストの中の次の本を取り出す処理を行う。
// 絵本コレクションのためのIterator
class BookIterator {
constructor(bookCollection) {
this.collection = bookCollection.getBooks(); // 絵本のリストを持つ
this.currentIndex = 0; // 現在の位置を保存する
}
hasNext() {
return this.currentIndex < this.collection.length; // 次の本があるかどうか
}
next() {
return this.collection[this.currentIndex++]; // 次の本を取り出す
}
}
最後に、Iteratorを使ってコレクションの中の本を1冊ずつ取り出していこう。順番に本を読むような動作だね。
// コレクションに絵本を追加
const myBooks = new BookCollection();
myBooks.addBook("ねずみくんのチョッキ");
myBooks.addBook("ぐりとぐら");
myBooks.addBook("はらぺこあおむし");
// Iteratorを使って順番に本を読む
const iterator = new BookIterator(myBooks);
while (iterator.hasNext()) {
console.log("今読んでいる本:", iterator.next());
}
hasNext()
メソッド)。
これでIteratorパターンの解説は終わりだ。
このパターンを使うと、コレクションの要素を簡単に順番に操作できるため、リストや配列の処理に非常に便利だ。