- PR -

GoF の Iteratorパターン

投稿者投稿内容
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2004-05-13 15:18
初めまして。Javaもデザインパターンも初心者なのですが、教えて頂けないでしょうか。
Javaを使ってデザインパターンの勉強をしています、
GoF の Iteratorパターンには、IteratorインタフェイスとAgregateインタフェイスが
登場しますが、java.util パッケージには java.util.Iterator がありますよね。
調べているうちに java.util.List は Agregateインタフェイス に相当するのかと
考えています。この考え方は正しいのでしょうか?

また正しいとすれば、GoFのデザインパターンで使用されているインターフェスは、Java
でほとんど提供されているのか。提供されているとすれば、同じ機能のインターフェイス
でも名前は全然違うのか(Agregateインタフェイス = java.util.List の様に)教えて
いただけないでしょうか。よろしくお願いします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-05-13 15:36
それぞれ違うものですから、どうとも言えないのでは
ほぼ同時期に発表ですから、雰囲気は似てても
Addison-Wesley ; ISBN: 0201633612 ; (1995/01/15)
1995. 05 Oak、Java に改称。 WebRunner、HotJava に改称。

UMLもスキーマもDBもJavaも違います。
【連載】Javaオブジェクトモデリング INDEX
http://www.atmarkit.co.jp/fjava/rensai2/jobjmdlindex/jobjmdindex.html
http://www.atmarkit.co.jp/fxml/rensai2/xmltool05/01.html
米山@クロノス
大ベテラン
会議室デビュー日: 2003/06/10
投稿数: 103
お住まい・勤務地: 大阪市淀川区西中島4-13-22 新大阪淀川ビル5F
投稿日時: 2004-05-13 16:17
こんにちは。米山@クロノスです。

引用:

u2airsotさんの書き込み (2004-05-13 15:18) より:
java.util.List は Agregateインタフェイス に相当するのかと
考えています。この考え方は正しいのでしょうか?



そうですね。
ListインターフェイスはIteratorにおけるAggregateだと思います。
ついでにCollectionインターフェイスも。

引用:

また正しいとすれば、GoFのデザインパターンで使用されているインターフェスは、Java
でほとんど提供されているのか。提供されているとすれば、同じ機能のインターフェイス
でも名前は全然違うのか(Agregateインタフェイス = java.util.List の様に)教えて
いただけないでしょうか。よろしくお願いします。



基本的にGoFのカタログで紹介されている名称は抽象的な役割名ではないでしょうか。
たとえば、Aggregateは「集合」という意味であり、実際にはもう少し具体的な名前がつけられていることが多いですね。
# 上記のように「List」など。

IteratorやObserverなど、そのまま同じ名前を使っている場合もありますが。
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2004-05-13 16:44
すいません。追記させてください。

デザインパターンのサンプルなどでは、自前で
Iterator.java と Agregate.java を作成している例しか見たことがないのですが、
実際のコーディングもこのように自前で用意しているのでしょうか?
それとも、ひょっとして一般的にIteratorパターンのコーディングを行う時は
java.util.Iterator と java.util.List を利用しているのかと思ったのです。
よろしくお願いします。

MMXさん>
回答ありがとうございます。
>UMLもスキーマもDBもJavaも違います。
ですが、すいませんMMXさんが、どの点を比べて『違う』か同じか
言ってくれているのか、分かりません。
僕も、明らかに違うと思うのですが・・・
MMXさんは違う点で『違う』と言ってる気がします。
できれば、どの点で『違う』と言って下さってるのか教えて頂けないでしょうか?
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-13 17:04
米山@クロノスさんの説明で十分そうですが、
引用:

u2airsotさんの書き込み (2004-05-13 15:18) より:
GoFのデザインパターンで使用されているインターフェスは、Javaでほとんど提供されているのか。提供されているとすれば、同じ機能のインターフェイスでも名前は全然違うのかAgregateインタフェイス = java.util.List の様に)教えていただけないでしょうか。よろしくお願いします。


この部分について、補足しておくと、
デザインパターンは手段であって、目的ではないので、パターンそのままのものをクラスライブラリとして提供することはあまりないと思います。GoFのパターン自体それほど複雑なものではないので、わざわざフレームワークとして提供しても、かえって使いにくかったりするのだと思います。

ただし、クラスライブラリの設計にはふんだんに取り入れられています。有名なところでは、java.io.*の入出力ストリームはDecoratorパターンになっています。GUIやbeanにつかわれるイベント処理は、Observerパターンの変形したものです。他にも、Decorator, Singleton, Strategy などは随所に使用されていますよ。

ちなみに、java1.5ではjava.lang.Iteratableインターフェースが追加されます。
java.util.Collectionインターフェースはこのインターフェースを継承するようになります。
Collectionよりも更に抽象的なIteratableはより、GoFのAggregateに近いものといえると思います。


# 書き込みの間に u2airsotさんの次の書き込みがあったので追記。

引用:

u2airsotさんの書き込み (2004-05-13 16:44) より:
デザインパターンのサンプルなどでは、自前で
Iterator.java と Agregate.java を作成している例しか見たことがないのですが、
実際のコーディングもこのように自前で用意しているのでしょうか?


それはおそらく、デザインパターンは言語に依存しないものであるため、(Javaのサンプルソースでも)言語に依存したライブラリなどは極力使わないようにしているのだと思います。自分の目的にあったクラスやインターフェースが既に提供されているのならば、それを使用すればよいと思います。

引用:

それとも、ひょっとして一般的にIteratorパターンのコーディングを行う時は
java.util.Iterator と java.util.List を利用しているのかと思ったのです。
よろしくお願いします。


これに関しては、java.util.Iteratorだけ使うのが今のところ有効だと思います。というのも、java.util.Listやその上位のjava.util.Collectionにはイテレータパターンの目的以外の、コレクションやリストとしてのメソッドも定義されているため、それが必要ない場合は邪魔になってしまいます。
またAggregateインターフェースに相当するものを自作する場合でも、目的に合ったより具体的なクラス/インターフェースを作成することになると思います。
例)java.security.cert.PolicyNodeなど
# もしくは、単にjava.util.ArrayListなどをインスタンス化して使うか

今のところと書いたのは、java1.5ならば、java.lang.Iteratableを使うのがよいかもしれないからです。



[ メッセージ編集済み 編集者: Wata 編集日時 2004-05-13 17:29 ]
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2004-05-13 17:07
米山@クロノスさん
ピンポイントなアドバイスありがとうございます。
もし、javaの方でインターフェイス用意されていれば、短いソースだとしても
自前のよりもそちらを使いたいです。衛生的に
対応表みたいなのがあれば、コアパッケージでソースを見ながら勉強できて良いと
思うのですが・・・。ありませんよね

すいません。最後にひとつ・・・。
GoFで紹介されているパターンのインターフェイスは、違う名前にしろjava
にもあると思っててだいたい正解でしょうか?
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2004-05-13 17:14
あー・・・またかぶってしまいました
Wataさん ありがとうございます。
全部あるとか、ないとかそんな問題じゃないと言うことですね
Iteratorパターンが初めて知ったパターンでまだそこから動けない状態
です。とりあえず深く考えずに他のパターンと教えて下さったクラスライブラリを
参考にしながら勉強していきたいと思います。

ありがとうございました(^^
米山@クロノス
大ベテラン
会議室デビュー日: 2003/06/10
投稿数: 103
お住まい・勤務地: 大阪市淀川区西中島4-13-22 新大阪淀川ビル5F
投稿日時: 2004-05-13 17:21
米山@クロノスです。

引用:

u2airsotさんの書き込み (2004-05-13 17:07) より:
もし、javaの方でインターフェイス用意されていれば、短いソースだとしても
自前のよりもそちらを使いたいです。衛生的に
対応表みたいなのがあれば、コアパッケージでソースを見ながら勉強できて良いと
思うのですが・・・。ありませんよね



対応表というのは見たことないですが、確かにそういったものがどこかで提供されていれば勉強には役立つでしょうね。
# ひょっとしたらどこかのサイトで紹介されているかもしれません。

Wataさんがおっしゃっているようにjava.ioパッケージのDecorator実装は有名ですし、SwingのライブラリにはStrategyやAdapterなど見つけることができますよ。
あとはFactory Methodも随所に使われていますので、一度ソースをいろいろ眺めて探すのも勉強になるかもしれません。

引用:

すいません。最後にひとつ・・・。
GoFで紹介されているパターンのインターフェイスは、違う名前にしろjava
にもあると思っててだいたい正解でしょうか?



全てのGoFのパターンを確かめたわけではありませんが、そう考えても間違いではないでしょう。

スキルアップ/キャリアアップ(JOB@IT)