I searched about this subjet arround here in Stack Overflow. I found the following solution:
Explanation of Visitor Pattern
Now, my case is simillar to this one. I need, however, to avoid the use of "instanceOf".
I have a game that has towers named MonkeyTower, CannonTower, OctoTower... and some other classes uses the instanceOf to compare.
Here's an example of a class that uses the instanceOf:
BloonsTower.java
public void mousePressed(Point p) {
Tower t = null;
selectedTower = towerInfo[ insertTowerIdx ].getTower();
if( selectedTower instanceof MonkeyTower )
t = tCreator.createMonkey();
else if( selectedTower instanceof OctoTower )
t = tCreator.createOctogonal();
else if( selectedTower instanceof CannonTower )
t = tCreator.createCannon();
else if( selectedTower instanceof MortarTower )
t = tCreator.createMortar();
setMoney( money - towerInfo[ insertTowerIdx ].getPrice() );
t.setPosition( p );
world.addTower(t);
currentState = new SelectTowerState();
}
ManipulatorCreator.java
if( t instanceof MonkeyTower )
return null;
else if( t instanceof OctoTower )
return new OctoManipulator( t );
else if( t instanceof CannonTower )
return null;
else if( t instanceof MortarTower )
return new MortarManipulator( (MortarTower)t );
return man;
And GameWriter:
public void saveFile( File file, int round, int money, int lives, World m ) throws IOException {
PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter( file) ) );
out.println( round );
out.println( money );
out.println( lives );
Tower []torres = m.getTowers();
out.println( torres.length ); // escrever o nº de torres
for( Tower t : torres ){
Point p = t.getComponent().getPosicao();
// escrever a posição e o tipo de torre
out.print(p.x+"\t" + p.y+"\t" );
if( t instanceof MonkeyTower )
out.println( "macaco" );
else if( t instanceof OctoTower )
out.println( "octo" );
else if( t instanceof CannonTower )
out.println( "canhao" );
else if( t instanceof MortarTower )
out.println( "morteiro" );
}
out.close();
}
What i've created is a class for visitor that visits every tower:
public class TowerVisitor implements Visitor{
public void visit(MonkeyTower monkey) {
// TODO Auto-generated method stub
}
public void visit(CannonTower cannon) {
// TODO Auto-generated method stub
}
public void visit(MortarTower mortar) {
// TODO Auto-generated method stub
}
public void visit(OctoTower octo) {
// TODO Auto-generated method stub
}
}
And, in each tower I've created has a method accept that returns itself
Now, I'm stuck in what to put inside the method visit and how to use the pattern to switch all the instanceOf's.
Thanks.
You should use core Object Oriented Programming patterns, namely inheritance, not a visitor pattern. You have several different types of towers, and similar actions (create, manipulate, toString, etc.) that should be implemented differently for each type of tower. A classic example of inheritance.
public abstract class Tower {
public abstract Tower create();
public abstract Manipulator manipulate();
}
---
public class MortarTower extends Tower {
@Override
public MortarTower create() {
return new MortarTower();
}
@Override
public MortarManipulator manipulate() {
return new MortarManipulator(this);
}
@Override
public String toString() {
return "morteiro";
}
}
---
public void mousePressed(Point p) {
selectedTower = towerInfo[insertTowerIdx].getTower();
setMoney(money - towerInfo[insertTowerIdx].getPrice());
Tower t = selectedTower.create();
t.setPosition(p);
world.addTower(t);
currentState = new SelectTowerState();
}
And so on.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With