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
}
私はデザインパターンを利用する方法を学ぶしようとしているので、おそらく私は過度に一般的なされています。戦略をイテレータにきれいに注入するにはどうすればよいですか?
あなたはそれと間違っているものを指定せずに、ここにコードを掲載しているので、私はこの質問をdownvotedしています。コードが期待すること、期待する理由、実際にやっていること、そしてそれが間違っている理由を期待しています。この情報を含めるためにあなたの質問を編集してください、そして私は私のdownvoteを引っ込めることを検討します。参照してください:[最小、完全、および検証可能な例を作成する方法](http://stackoverflow.com/help/mcve) –
@JoeC私の質問は、上記のコードで何が間違っているかを明確に述べています。 'MyIteratorStrategy'オブジェクトはイテレータ構築の一部として** ** Iterableインタフェースはオブジェクトをイテレータメソッドに渡すことを許可しません**" – mk62
次に、Iterable >が実装する正しいインタフェースであるかどうか再考する必要があると思います。 –