Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Iteratorパターンに触れてみる

Posted at

今日の目標

JavaのIteratorパターンと触れ合う

使うもの

ではスタート

はじめに

Iteratorパターンってなんだ、というとこから。まずはWikipediaを見てみる。

Iterator パターン(イテレータ・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とする。(WikidediaのIteratorパターン

Listを実装しているクラスはこのパターンに沿ってるみたい。
上記の本はIteratorを自分で作ってIteratorパターンを理解させるようになってます。実際理解できたか、というと「ちょっと微妙」なところですが、何となくこういうことがいいんだろうなあ、とは思いました。

本のサンプルを試してみる

とりあえず、本のサンプルプログラムを実装してみる。

Aggregate.java
package util;

public interface Aggregate {

	public abstract Iterator iterator();
}
Iterator.java
package util;

public interface Iterator {

	public abstract boolean hasNext();

	public abstract Object next();
}
Book.java
package book;

public class Book {

	private String name;

	public Book(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}
BookShelf.java
package book;

import util.Aggregate;
import util.Iterator;

public class BookShelf implements Aggregate {

	private Book[] books;
	private int last = 0;
	public BookShelf(int maxsize) {
		this.books = new Book[maxsize];
	}

	public Book getBookAt(int index) {
		return books[index];
	}

	public void appendBook(Book book) {
		this.books[last] = book;
		last++;
	}

	public int getLength() {
		return last;
	}

	@Override
	public Iterator iterator() {
		return new BookShelfIterator(this);
	}

}
BookShelfIterator.java
package book;

import util.Iterator;

public class BookShelfIterator implements Iterator {

	private BookShelf bookShelf;
	private int index;
	public BookShelfIterator(BookShelf bookShelf) {
		this.bookShelf = bookShelf;
		this.index = 0;
	}

	@Override
	public boolean hasNext() {
		if(index < bookShelf.getLength()) {
			return true;
		} else {
			return false;
		}
	}
	@Override
	public Object next() {
		Book book = bookShelf.getBookAt(index);
		index++;
		return book;
	}

}

実際に呼び出すのは下のMainクラス。

Main.java
package book;

import util.Iterator;

public class Main {

	public static void main(String[] args) {
		main1();
	}

	// Iterator
	public static void main1() {
		BookShelf bookShelf = new BookShelf(4);
		bookShelf.appendBook(new Book("アガサクリスティの事件簿"));
		bookShelf.appendBook(new Book("イテレートしたらどうだろうか"));
		bookShelf.appendBook(new Book("ウサビッチは叫ぶ"));
		bookShelf.appendBook(new Book("エクスプローラの暴走"));
		Iterator it = bookShelf.iterator();
		while(it.hasNext()) {
			Book book = (Book)it.next();
			System.out.println(book.getName());
		}
	}
}
  • IteratorをimplementsしたクラスはnextとhasNextを実装する必要があります
  • AggregateをimplementsしたクラスはIteratorを実装する必要があります
  • この本のサンプルでは、Iteratorの役割をBookShelfIteratorが、Aggregateの役割をBookShelfが担っています

ということですが。
関係性がまったくわからなくて絵を描いてみた。
image1(1).JPG

わかったことは

  • Aggregateを実装したクラスはIteratorを生み出す能力を持つ
    • 使う側から見たら、BookShelfが作ったIteratorを使えばBookShelfの要素を順に取り出せるんだなとわかる
  • 使う側(Main)で取り出し方を考えなくても良い
    • もし逆順に取り出したいと思ったらIteratorインタフェースに逆順用のメソッドを追加して、BookShelfIteratorが実装しとけばよい

そして、

Javaパターンを勉強するにはInterfaceの考え方をきっちり自分の中で持ってないとわからなくなる、ということ。
Interface苦手な私にとってはわからないことだらけだが、パターンを実装しつつ徐々にわかっていければよいかな、と思いました。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?