Wire in visitors to RocketComponent. Added some abstract

implementations of RocketComponentVisitior which provide for recursive
actions.
This commit is contained in:
kruland2607 2012-10-19 16:00:11 -05:00
parent 6d190095a7
commit 30ffb12d7f
4 changed files with 54 additions and 3 deletions

View File

@ -23,7 +23,7 @@ import net.sf.openrocket.util.SimpleStack;
import net.sf.openrocket.util.UniqueID;
public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent> {
public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent>, Visitable<RocketComponentVisitor,RocketComponent> {
private static final LogHelper log = Application.getLogger();
private static final Translator trans = Application.getTranslator();
@ -1691,8 +1691,12 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
return id.hashCode();
}
///////////// Visitor pattern implementation
@Override
public void accept(RocketComponentVisitor visitor) {
visitor.visit(this);
}
//////////// Helper methods for subclasses

View File

@ -0,0 +1,5 @@
package net.sf.openrocket.rocketcomponent;
public interface RocketComponentVisitor extends Visitor<RocketComponentVisitor, RocketComponent> {
}

View File

@ -0,0 +1,21 @@
package net.sf.openrocket.rocketvisitors;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.RocketComponentVisitor;
public abstract class BredthFirstRecusiveVisitor implements RocketComponentVisitor {
@Override
public final void visit(RocketComponent visitable) {
for ( RocketComponent child: visitable.getChildren() ) {
this.visit(child);
}
this.doAction(visitable);
}
protected abstract void doAction( RocketComponent visitable );
}

View File

@ -0,0 +1,21 @@
package net.sf.openrocket.rocketvisitors;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.RocketComponentVisitor;
public abstract class DepthFirstRecusiveVisitor implements RocketComponentVisitor {
@Override
public final void visit(RocketComponent visitable) {
this.doAction(visitable);
for ( RocketComponent child: visitable.getChildren() ) {
this.visit(child);
}
}
protected abstract void doAction( RocketComponent visitable );
}