【发布时间】:2015-07-24 01:13:42
【问题描述】:
代码:
public class Composite extends Component implements Iterable<Component>{
private List<Component> caseComponents = new ArrayList<Component>();
@Override
public Iterator<Component> iterator(){
return new CompIterator();
}
private class CompIterator implements Iterator{
int index = 0;
@Override
public boolean hasNext(){
if(index<caseComponents.size()){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return caseComponents.get(index++);
}
return null;
}
}
public String breadthFirst() {
Queue<Component> q = new LinkedList<Component>();
StringBuilder stringRep = new StringBuilder();
q.add(this);
while(q.element()!=null){
Component first = q.remove();
System.out.println(first.name);
for(Component c : first.caseComponents){
q.add(c);
}
}
}
我正在尝试对复合设计模式的树进行广度优先打印。我已经声明了一个应该由树的“根”调用的方法。在树中,将有 Composite 和 Leaf 类的对象。它们都继承自Component,但当然是不同的。 Composite 是一个容器对象,也是一个对象本身,而Leaf 只是一个对象。我想更改我的代码,以便仅当first 是Composite 的实例时才执行for(Component c : first.caseComponents) 行,否则它将尝试迭代Leaf,这是不可能的。我怎样才能做到只有当first是Composite时才输入for语句?
【问题讨论】:
标签: java iterator composite iterable