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)
然后检查并调用这些'钩子'?
命令模式可能是您更好的选择。说,你有命令对象实现接口:
public Interface Command {
void processEvent(Event e);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以有一些命令的散列,由事件代码键控 - 更具可读性。你甚至可以使用 DI 容器(spring 是最流行的,但也有 picocontainer 或 google guice,当然我错过了一些)来创建命令对象 - 只需将相应的对象与键注册为事件代码。这将为您节省散列填充的代码。
它甚至不必是很多类——它可能只是不同配置的实例(取决于你的用例)——今天没有类公开
为什么不针对每种情况采用单独的方法呢?这样,它会使您的代码更具可读性。
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)