[英]Java - implement iterator with strategy
我正在嘗試為復合類實現自定義迭代器,並在迭代器實現中使用不同的策略,具體取決於客戶端希望如何遍歷復合結構。
public class MyComposite implements Iterable<MyComponent> {
ArrayList<MyComponent> childComponents;
//MyComposite methods
@Override
public Iterator<MyComponent> iterator() {
return new MyIterator(this);
}
}
我想將MyIteratorStrategy
對象作為迭代器構造的一部分傳遞,但是Iterable
接口不允許將對象傳遞給iterator
方法。
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
}
我正在嘗試學習如何利用設計模式,所以也許我過於籠統了。 如何將策略完全注入迭代器?
將MyIterator
更改為實現Iterable<MyComponent>
,而不是Iterator
。 (為清楚起見,您可能希望將其重命名為MyComponentScanner
的名稱。)
將public Iterator<MyComponent> iterator()
方法從MyComposite
類移至MyIterator
(或任何您重命名的方法)。
例...
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.