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.