Я искал об этом подэлементе arround здесь, в Stack Overflow. Я нашел следующее решение:Избегайте использования InstanceOf с шаблоном посетителя - Java
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;
И 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
.
Спасибо.
Я не понимаю, почему вам нужен шаблон посетителя. Почему бы не создать абстрактные методы: 'Tower.createTower()', 'Tower.createManipulator() 'и т. д.? – shmosel
Вам нужен шаблон FactoryMethod, а не посетитель. –
Я не думаю, что мне нужна фабрика. Все объекты являются башнями, независимо от того, являются ли они разными башнями, они реализуют один и тот же интерфейс – user1987003