質問: プログラミング初心者でJavaでIteratorについて学んだのですが、 ・Iteratorには大まかに二つ役割があって、それはIteratorクラスとAggregateクラスの二つなのですが、実際にJavaで提供されているAPIはIteratorがjava.util.Iteratorクラス(Enumerationというのもありました)、AggregateがArrayListやMap、Setなどのことだと考えていいのですか? ・デザインパターンの本を読んでいるとMainクラスを作る人とそれ以外のクラス(デザインパターンで作るクラス群)を作る人は別の人だと考えていいのですか?(つまり前者は仕様を読んでAPIを利用する側) いまいち理解が曖昧で確証が持てなくてもやもやしています。 どなたか御回答お願いします。
回答: GoFデザインパターンによる「Iteratorパターン」と、Java標準ライブラリが提供する「`Iterator`インタフェース」とを区別して説明します。 * Iteratorパターン:「データ集合の要素走査」を目的としたクラス設計構造に名前をつけたもの。 * Iteratorインタフェース:Java言語でIteratorパターンを実現する際に利用するAPI。 > > Iteratorには大まかに二つ役割があって、それはIteratorクラスとAggregateクラスの二つなのですが、実際にJavaで提供されているAPIはIteratorがjava.util.Iteratorクラス(Enumerationというのもありました)、AggregateがArrayListやMap、Setなどのことだと考えていいのですか? > > > 概ね正しい解釈と思います。より正確に表現するならば: * Iteratorパターンはインタフェースを規定する「(抽象)Iteratorクラス」「(抽象)Aggregateクラス」、それらを実装する「ConcreteIteratorクラス」「ConcreteAggregateクラス」で記述される。 * Java言語の`java.util.Iterator`インタフェースは、Iteratorパターンの「(抽象)Iteratorクラス」に対応する。 * Java言語の`java.util.Collection`インタフェースは、Iteratorパターンの「(抽象)Aggregateクラス」に対応する。 * Java言語の`ArrayList`, `Map`, `Set`等は、Iteratorパターンの「ConcreteAggregateクラス」に対応する。 > > デザインパターンの本を読んでいるとMainクラスを作る人とそれ以外のクラス(デザインパターンで作るクラス群)を作る人は別の人だと考えていいのですか?(つまり前者は仕様を読んでAPIを利用する側) > > > どちらのケースもありえます。デザインパターンはソフトウェアの「設計(Design)を類型化したもの」に過ぎません。あるデザインパターンに従ったクラス設計を、第三者が行ってあなたがそれを利用するケースもあれば、あなた自身が記述するクラス設計がデザインパターンに従うこともあります。