更换大型案例陈述

jSh*_*erz 6 java hook design-patterns

我正在尝试改进使用大量大型语句的Java项目.在使用case语句的情况下,它用于处理具有与之关联的属性的事件.例如:

public void jumpOverWall(int wallID) {
    switch (wallID) {
            case 0:
            case 1213:
            case 2123:
            case 3123:
            case 4123:
    }
}
Run Code Online (Sandbox Code Playgroud)

这些数字是非连续的,并且都需要执行不同的操作 - 例如说"你不能跳过这个墙"或将角色移动到设定位置.案例响应遵循固定模式的情况非常少.我的意思是,switch语句不遵循允许类似于以下代码的模式:

public void jumpOverWall(int wallID) {
    someArray[1213] = 10;
    someArray[3123] = 20;

    if (playerJumpingSkill > someArray[wallID]) {
            // Do something
    } else {
            sendPlayerMessage("You cannot do this!");
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我想知道处理这些"事件"的最佳方式."事件处理程序"风格系统的整个想法对我很有吸引力,但我不知道如何实现它(或者更好地解决问题).有太多"事件"(在我看来)每个都有一个单独的课程.

有挂钩活动的方法/设计吗?这适用/工作吗?我正在寻找一种方便挂钩的方法,例如:

hookEvent(1213, new SomeInterface() {
    boolean eventOK() {
        // Do something
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后检查并调用这些'钩子'?

Kon*_*uda 6

命令模式可能是您更好的选择。说,你有命令对象实现接口:

public Interface Command {
      void processEvent(Event e);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以有一些命令的散列,由事件代码键控 - 更具可读性。你甚至可以使用 DI 容器(spring 是最流行的,但也有 picocontainer 或 google guice,当然我错过了一些)来创建命令对象 - 只需将相应的对象与键注册为事件代码。这将为您节省散列填充的代码。

它甚至不必是很多类——它可能只是不同配置的实例(取决于你的用例)——今天没有类公开


Cod*_*lue 2

为什么不针对每种情况采用单独的方法呢?这样,它会使您的代码更具可读性。

public void jumpOverWall(int wallID)
{
      switch (wallID) 
        {
        case 0:     methodA(wallID); break; // you could of course have a more descriptive name here.
        case 1213:  methodB(wallID); break; 
        case 2123:  methodC(wallID); break;
        case 3123:  methodD(wallID); break;
        case 4123:  methodE(wallID); break;
        }
}
Run Code Online (Sandbox Code Playgroud)