在不支持多分派的语言中,例如 Java,代码可能看起来像这样
/* Example using run time type comparison via Java's "instanceof" operator */
interface Collideable {
void collideWith(Collideable other);
}
class Asteroid implements Collideable {
public void collideWith(Collideable other) {
if (other instanceof Asteroid) {
System.out.println("AAAAAA");
} else if (other instanceof Spaceship) {
System.out.println("BBBBBB");
} else if (other instanceof Plane) {
System.out.println("CCCCCCC");
}
}
}
class Spaceship implements Collideable {
public void collideWith(Collideable other) {
if (other instanceof Asteroid) {
System.out.println("DDDDDDD");
} else if (other instanceof Spaceship) {
System.out.println("EEEEEEE");
} else if (other instanceof Plane) {
System.out.println("FFFFFFF");
}
}
}
class Plane implements Collideable {
public void collideWith(Collideable other) {
if (other instanceof Asteroid) {
System.out.println("GGGGGGG");
}else if (other instanceof Spaceship) {
System.out.println("HHHHHHH");
}else if (other instanceof Plane) {
System.out.println("KKKKKK");
}
}
}
由于访问者模式可以帮助解决这个问题,我正在考虑是否应该使用 void collideWith() { visitor.visit(this); 来实现每个叶子类。// 在 setter 中设置访问者 }
interface Visitor {
void visit(Collideable c);
void visit(Asteroid c);
void visit(Spaceship c);
void visit(Plane c);
}
那么每个唯一的 println 应该在如下访问者的子类中实现?
class AsteroidVisitor implements Visitor {
void visit(Collideable c) {}
void visit(Asteroid c) { System.out.println("AAAAAA"); }
void visit(Spaceship c) { System.out.println("BBBBBBB"); }
void visit(Plane c) { System.out.println("CCCCCC"); }
}
//etc for SpaceshipVisitor and PlaneVisitor()
替换instanceof是处理这种重构的最佳方法吗?
编辑:打印输出只是每种方法中独特操作的示例,而不是最终结果。我修改了我的示例以使其清楚。