【发布时间】:2016-01-08 00:16:20
【问题描述】:
我在 Stack Overflow 上搜索了这个 subjet arround。我找到了以下解决方案:
Explanation of Visitor Pattern
现在,我的情况与此类似。但是,我需要避免使用“instanceOf”。
我有一个游戏,其中包含名为 MonkeyTower、CannonTower、OctoTower... 的塔,其他一些类使用 instanceOf 进行比较。
这是一个使用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;
还有游戏作家:
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();
}
我创建的是一个访问每个塔的访客类:
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
}
}
而且,在我创建的每个塔中,都有一个方法 accept 返回自身
现在,我陷入了在方法 visit 中放入什么以及如何使用该模式来切换所有 instanceOf 的问题。
谢谢。
【问题讨论】:
-
我不明白您为什么需要访问者模式。为什么不创建抽象方法:
Tower.createTower()、Tower.createManipulator()等? -
你需要 FactoryMethod 模式而不是访问者。
-
我认为我不需要工厂。所有的对象都是塔,如果它们是不同的塔,它们独立地实现相同的接口
标签: java design-patterns factory-pattern instanceof visitor-pattern