使用“告诉,不要问”:与其问对象它们是什么,然后对此做出反应,不如告诉对象该做什么,然后墙壁或人们决定他们如何做他们需要做的事情。
例如:
而不是像这样的东西:
public class Wall {
// ...
}
public class Person {
// ...
}
// later
public class moveTo(Position pos) {
Object whatIsThere = pos.whatIsThere();
if (whatIsThere instanceof Wall) {
System.err.println("You cannot move into a wall");
}
else if (whatIsThere instanceof Person) {
System.err.println("You bump into " + person.getName());
}
// many more else branches...
}
执行如下操作:
public interface DungeonFeature {
void moveInto();
}
public class Wall implements DungeonFeature {
@Override
public void moveInto() {
System.err.println("You bump into a wall");
}
// ...
}
public class Person implements DungeonFeature {
private String name;
@Override
public void moveInto() {
System.err.println("You bump into " + name);
}
// ...
}
// and later
public void moveTo(Position pos) {
DungeonFeature df = currentPosition();
df.moveTo(pos);
}
这有一些优点。
首先,你不需要在每次添加新的地下城功能时都调整一个巨人树。
其次,地牢中的代码功能是自包含的,逻辑都在所述对象中。您可以轻松测试并移动它。