多个操作取决于传递的对象的类型

mix*_*ixm 2 java api-design

假设我创建了一个传递对象的方法,该方法将根据传递的对象执行操作.我该如何识别物体?

我想过使用类名来标识对象,但这可能是不切实际的,因为我可以轻松地更改对象的类名,并在将来的开发过程中产生令人头疼的问题.我对吗?

编辑:例如,我有对象球和炸弹.如果我有另一个叫做墙的物体,墙有解决与墙碰撞的方法(例如碰撞球和炸弹的坐标),但根据碰撞对象(即球和炸弹)有不同的逻辑

Boz*_*zho 7

您要求的是instanceof运营商.

if (object instanceof SomeClass) {
  // do something
} else if (object instanceof SomeOtherClass) {
  // do something else
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是一个好习惯.相反,您可以使用所谓的双重调度.使传递的对象符合接口,该接口根据另一个类定义操作.所以:

public interface ThrowableItem {
   void throwAt(Wall wall);
}

public class Wall {
    void accept(ThrowableItem item) {
        item.throwAt(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后提供适当的实现方式内BallBomb(两者实现ThrowableItem)

查看访问者模式 - 您可以将操作移动到WallVisitor知道如何处理每个对象的聚合的操作.