2

わかりやすくするために編集

Java を使用してさまざまなパターンの使用法を示すデザイン パターンに関する一連のチュートリアル ビデオを見ていたのですが、「The Iterator Design Pattern」というタイトルのビデオにたどり着いたとき、標準の Java イテレータを使用しているように見えました。以前に Java でイテレータを使用したことがありますが、イテレータを「設計パターン」として教えられたことはありませんでした。Javaでイテレータを使用することと「イテレータ設計パターン」を使用することに違いはありますか? もしそうなら、違いは何ですか?

4

4 に答える 4

2

Java で使用した反復子は、実際にはIterator 設計パターンを実装しています。彼らは:

基になる表現を公開せずに、集約オブジェクトの要素に順番にアクセスする方法を提供します。 <ウィキペディア記事の定義>

Java のIterable インターフェースのドキュメントでわかるように、ご存知のコンテナーのほとんどは、次の目的で使用される Iterator オブジェクトを提供します。

基になる表現を公開せずに、要素に順番にアクセスします。

于 2013-08-20T12:15:11.393 に答える
1

私が考えることができる最高のものは、Iterator Patternを使用してカスタム コレクションのカスタム Iterator を作成することです

以下の例では、降順で反復する My Custom Collection と Custom Iterator を作成しました。

注 - これは Collections.reverseOrder() で実行できます。説明のために、私はそれを取りました。

package com.designpattern.behavioural.iteratorpattern;

/*
 * Java Iterator Pattern
 * Iterator Pattern allows to access the elements in an Object in a sequential manner rather than exposing the internal logic 
 * Use Case - Traverse on  different way based on the requirement
 */

/*
 * Iterator interface
 */
interface Iterator {

    public boolean hasNext();
    public Object next();

}

/*
 * Repository interface
 */
interface MyCollection {

    public Iterator getIterator();

}

/*
 * Repository and iterator implementation
 * Customized iteration - Iterate in reverse order
 */
class MyCustomCollection implements MyCollection {

    RepositoryIterator iterator = null;

    @Override
    public Iterator getIterator() {
        iterator = new RepositoryIterator();
        return iterator;
    }

    private class RepositoryIterator implements Iterator {

        String[] elements = {"1","2","3","4","5","6","7","8"};

        int index = 0;

        @Override
        public boolean hasNext() {
            if (index < elements.length) {

                return true;
            }
            return false;
        }

        @Override
        public Object next() {
            if (this.hasNext()) {
                index += 1;
                return elements[elements.length-index];

            }
            return null;
        }

    }

}

public class IteratorPattern {

    public static void main(String[] args) {

        MyCollection myCollection = new MyCustomCollection();

        for (Iterator iterator = myCollection.getIterator() ; iterator.hasNext();) {
            System.out.println(iterator.next());
        }

    }

}

出力:

8 7 6 5 4 3 2 1

于 2015-07-10T13:39:52.717 に答える
1

この質問は非常に一般的なもので、コンテキストはほとんどありませんが、おそらく彼らが理解しているのは、反復子 (基になるデータへのハンドルを持ち、何らかの方法でシーケンス内を移動できるもの) を使用することと、インデックス (シーケンスに何ステップ入ったかを示すもの) を使用して、シーケンスのようなものをトラバースします。

于 2013-08-12T15:45:11.093 に答える
0

@Kvassプログラミング言語にタグを付けることで、質問を明確にすることができます。Iterator がインターフェイスであり、チュートリアルがこのインターフェイスを介して表現されている場合は問題ありません。

ただし、一部のリソースでは少し言及されています。

イテレータに適したこのリソースが必要な場合http://www.dofactory.com/Patterns/PatternIterator.aspx#_self1トラバースされるデータは、ここでインデックス付きプロパティです。

ハッシュされたリストまたはその他のものにすることができます。ポイントは、first、next、last、currentItem のような属性を持つ抽象イテレータ インターフェイスを取得することです。CreateIterator や GetEnumerator などのメソッドによって。

于 2013-08-13T10:28:56.603 に答える