- - PR -
GoF の Iteratorパターン
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 の様に)教えて いただけないでしょうか。よろしくお願いします。 | ||||||||||||
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2004-05-13 16:17
こんにちは。米山@クロノスです。
そうですね。 ListインターフェイスはIteratorにおけるAggregateだと思います。 ついでにCollectionインターフェイスも。
基本的にGoFのカタログで紹介されている名称は抽象的な役割名ではないでしょうか。 たとえば、Aggregateは「集合」という意味であり、実際にはもう少し具体的な名前がつけられていることが多いですね。 # 上記のように「List」など。 IteratorやObserverなど、そのまま同じ名前を使っている場合もありますが。 | ||||||||||||
|
投稿日時: 2004-05-13 16:44
すいません。追記させてください。
デザインパターンのサンプルなどでは、自前で Iterator.java と Agregate.java を作成している例しか見たことがないのですが、 実際のコーディングもこのように自前で用意しているのでしょうか? それとも、ひょっとして一般的にIteratorパターンのコーディングを行う時は java.util.Iterator と java.util.List を利用しているのかと思ったのです。 よろしくお願いします。 MMXさん> 回答ありがとうございます。 >UMLもスキーマもDBもJavaも違います。 ですが、すいません 言ってくれているのか、分かりません。 僕も、明らかに違うと思うのですが・・・ MMXさんは違う点で『違う』と言ってる気がします。 できれば、どの点で『違う』と言って下さってるのか教えて頂けないでしょうか? | ||||||||||||
|
投稿日時: 2004-05-13 17:04
米山@クロノスさんの説明で十分そうですが、
この部分について、補足しておくと、 デザインパターンは手段であって、目的ではないので、パターンそのままのものをクラスライブラリとして提供することはあまりないと思います。GoFのパターン自体それほど複雑なものではないので、わざわざフレームワークとして提供しても、かえって使いにくかったりするのだと思います。 ただし、クラスライブラリの設計にはふんだんに取り入れられています。有名なところでは、java.io.*の入出力ストリームはDecoratorパターンになっています。GUIやbeanにつかわれるイベント処理は、Observerパターンの変形したものです。他にも、Decorator, Singleton, Strategy などは随所に使用されていますよ。 ちなみに、java1.5ではjava.lang.Iteratableインターフェースが追加されます。 java.util.Collectionインターフェースはこのインターフェースを継承するようになります。 Collectionよりも更に抽象的なIteratableはより、GoFのAggregateに近いものといえると思います。 # 書き込みの間に u2airsotさんの次の書き込みがあったので追記。
それはおそらく、デザインパターンは言語に依存しないものであるため、(Javaのサンプルソースでも)言語に依存したライブラリなどは極力使わないようにしているのだと思います。自分の目的にあったクラスやインターフェースが既に提供されているのならば、それを使用すればよいと思います。
これに関しては、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 ] | ||||||||||||
|
投稿日時: 2004-05-13 17:07
米山@クロノスさん
ピンポイントなアドバイスありがとうございます。 もし、javaの方でインターフェイス用意されていれば、短いソースだとしても 自前のよりもそちらを使いたいです。衛生的に 対応表みたいなのがあれば、コアパッケージでソースを見ながら勉強できて良いと 思うのですが・・・。ありませんよね すいません。最後にひとつ・・・。 GoFで紹介されているパターンのインターフェイスは、違う名前にしろjava にもあると思っててだいたい正解でしょうか? | ||||||||||||
|
投稿日時: 2004-05-13 17:14
あー・・・またかぶってしまいましたWataさん ありがとうございます。 全部あるとか、ないとかそんな問題じゃないと言うことですね Iteratorパターンが初めて知ったパターンでまだそこから動けない状態 です。とりあえず深く考えずに他のパターンと教えて下さったクラスライブラリを 参考にしながら勉強していきたいと思います。 ありがとうございました(^^ | ||||||||||||
|
投稿日時: 2004-05-13 17:21
米山@クロノスです。
対応表というのは見たことないですが、確かにそういったものがどこかで提供されていれば勉強には役立つでしょうね。 # ひょっとしたらどこかのサイトで紹介されているかもしれません。 Wataさんがおっしゃっているようにjava.ioパッケージのDecorator実装は有名ですし、SwingのライブラリにはStrategyやAdapterなど見つけることができますよ。 あとはFactory Methodも随所に使われていますので、一度ソースをいろいろ眺めて探すのも勉強になるかもしれません。
全てのGoFのパターンを確かめたわけではありませんが、そう考えても間違いではないでしょう。 | ||||||||||||
