2017-11-12 21 views
0

コンポジットクラスのカスタムイテレータを実装しようとしています。クライアントがコンポジット構造をどのようにトラバースするかによって、イテレータ実装でさまざまな戦略を使用します。Java - 戦略でイテレータを実装する

public class MyComposite implements Iterable<MyComponent> { 

    ArrayList<MyComponent> childComponents; 

    //MyComposite methods 

    @Override 
    public Iterator<MyComponent> iterator() { 
     return new MyIterator(this); 
    } 
} 

IしかしIterableインタフェースはiteratorメソッドにオブジェクトを渡すことはできません、イテレータ構造の一部としてMyIteratorStrategyオブジェクトを渡したいです。ここで

public class SomeClient { 
    private void traverseComposite() { 
     MyComposite myComposite = new MyComposite(); 

     MyIteratorStrategy fooStrategy = new MyIteratorStrategy("foo"); 
     MyIteratorStrategy barStrategy = new MyIteratorStrategy("bar"); 

     MyIterator fooIterator = myComposite.iterator(fooStrategy); 
     MyIterator barIterator = myComposite.iterator(barStrategy);  
    } 
} 

は、私はイテレータの実装に戦略を利用しています方法は次のとおりです。

public class MyIterator implements Iterator<MyComponent> { 

    MyComponent component; 
    MyIteratorStrategy strategy; 

    public MyIterator(MyComponent component, MyIteratorStrategy strategy) { 
     this.component = component; 
     this.strategy = strategy; 
    } 

    @Override 
    public Component next() { 
     if(strategy.isDone(component) { 
      //return some child component 
     } else { 
      //return some other child component 
     } 
    } 

    //rest of implementation 
} 

私はデザインパターンを利用する方法を学ぶしようとしているので、おそらく私は過度に一般的なされています。戦略をイテレータにきれいに注入するにはどうすればよいですか?

+0

あなたはそれと間違っているものを指定せずに、ここにコードを掲載しているので、私はこの質問をd​​ownvotedしています。コードが期待すること、期待する理由、実際にやっていること、そしてそれが間違っている理由を期待しています。この情報を含めるためにあなたの質問を編集してください、そして私は私のdownvoteを引っ込めることを検討します。参照してください:[最小、完全、および検証可能な例を作成する方法](http://stackoverflow.com/help/mcve) –

+0

@JoeC私の質問は、上記のコードで何が間違っているかを明確に述べています。 'MyIteratorStrategy'オブジェクトはイテレータ構築の一部として** ** Iterableインタフェースはオブジェクトをイテレータメソッドに渡すことを許可しません**" – mk62

+0

次に、Iterable が実装する正しいインタフェースであるかどうか再考する必要があると思います。 –

答えて

0

MyIteratorIteratorの代わりにIterable<MyComponent>を実装するクラスに変更します。 (あなたはそれを明確にするためMyComponentScannerのようなものの名前を変更したい場合があります。)

MyIteratorMyCompositeクラスから public Iterator<MyComponent> iterator()メソッドを上に移動

(または名前を変更何でも)。

例...

public class MyComponentScanner implements Iterable<MyComponent> { 

    MyComponent component; 
    MyIteratorStrategy strategy; 

    public MyComponentScanner(MyComponent component, MyIteratorStrategy strategy) { 
     this.component = component; 
     this.strategy = strategy; 
    } 

    @Override 
    public Iterator<MyComponent> iterator() { 
     return new Iterator() { 
      @Override 
      public Component next() { 
       if(strategy.isDone(component) { 
        //return some child component 
       } else { 
        //return some other child component 
       } 
      } 
     }; 
    } 

    //rest of implementation 
} 
関連する問題