这是一个编程风格问题,关于将输入键映射到实现状态模式的类中的操作的最佳策略。
我正在处理两个班级:
第一个实现状态模式,它控制多状态物理设备:
class DeviceController {
State _a, _b, _current;
// Actions that may prompt a transition from one state to another
public void actionA() { ... }
public void actionB() { ... }
public void actionC() { ... }
public State getStateA() { ... }
public State getStateB() { ... }
public void setCurrentState() { ... }
};
第二个是KeyListener,它检索所有键盘输入,并在按下的输入键与(暂时)硬编码绑定表匹配时从设备控制器调用相应的操作:
class KeyDemo implements KeyListener {
DeviceController _controller;
...
@Override
public void keyPressed(KeyEvent arg0) {
char key = Character.toUpperCase(arg0.getKeyChar());
switch (key) {
case 'A':
_controller.actionA();
break;
case 'B' :
...
}
...
}
是否有最佳实践编码样式将键绑定到控制器中的操作?我是否必须通过switch语句,如示例代码中所示?在我看来,这个解决方案有点脏代码:不是状态模式应该消除unmaintanable if和switch控制结构?
感谢您的支持。
答案 0 :(得分:0)
使用多态性,您可以实现目标。我使用了枚举,但也许更适合使用接口或抽象类,然后实现每个关键处理器。你觉得怎么样?
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
enum KeyProcessor {
A {
void executeAction() {
_controller.actionA();
}
},
B {
void executeAction() {
_controller.actionB();
}
};
private static final DeviceController _controller = new DeviceController();
void executeAction() {
System.out.println("no action defined");
}
}
class DeviceController {
State _a;
State _b;
State _current;
// Actions that may prompt a transition from one state to another
public void actionA() {
System.out.println("action A performed.");
}
public void actionB() {
System.out.println("action B performed.");
}
public void actionC() {
}
public State getStateA() {
return null;
}
public State getStateB() {
return null;
}
public void setCurrentState() {
}
} // end class DeviceController
public class KeyDemo implements KeyListener {
DeviceController _controller;
// ...
@Override
public void keyPressed(KeyEvent arg0) {
keyPressed(Character.toUpperCase(arg0.getKeyChar()));
// ...
}
public void keyPressed(char c) {
KeyProcessor processor = KeyProcessor.valueOf(c + "");
if (processor != null) {
processor.executeAction();
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
public static final void main(String[] args) {
KeyDemo main = new KeyDemo();
main.keyPressed('A');
main.keyPressed('B');
}
} // end class KeyDemo
class State {
}