gpt4 book ai didi

java - 避免将 InstanceOf 与访问者模式一起使用 - Java

转载 作者:行者123 更新时间:2023-11-30 08:42:08 25 4
gpt4 key购买 nike

我在 Stack Overflow 中搜索了这个 subjet。我找到了以下解决方案:

Explanation of Visitor Pattern

现在,我的情况与此类似。但是,我需要避免使用“instanceOf”。

我有一个游戏,其中的塔名为 MonkeyTowerCannonTowerOctoTower...还有一些其他类使用 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;

和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();
}

我创建的是一个访问每座塔的访客类:

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 的问题。

谢谢。

最佳答案

你应该使用核心 Object Oriented Programming模式,即继承,而不是访问者模式。您有几种不同类型的塔,以及应该针对每种类型的塔以不同方式实现的类似操作(创建、操作、toString 等)。继承的经典例子。

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();
}

等等。

关于java - 避免将 InstanceOf 与访问者模式一起使用 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com