我搜索了很多关于重构大型 switch 的文章陈述。
但他们不做我想做的事。问题我要去要运行的是有一个巨大的 switch 语句,它根据两个不同的值调用不同的方法,比如说 type和一个 code .
目前,我会处理这样的情况:
switch (type)
{
case Types.Type1:
handleType1(code);
break;
case Types.Type2:
handleType2(code);
break;
}
void handleTypeN(code)
{
switch (code)
{
...
}
}
也许结合工厂和命令模式的东西会帮助我?我一定遗漏了一些明显的东西。
你会如何重构这段代码?
我可能需要更具体地了解我面临的情况。
我正在从服务器接收数据包。一个数据包包含一个类型和一个代码以及一些特定的信息。
数据一到达我就检索
type和
code数据包,它进入
switch
type 声明,在弄清楚
type 之后调用特定方法对
code进行切换的数据包。
处理代码的方法现在进一步解码数据包并完成该过程。
+----------+ +----------+
| | Packet | |
| Server | -------------> | Client |
| | | |
+----------+ +----------+
|
|
(Switch on the type of the packet and call a specific method)
|
|
(Switch on the code of the packet and call a specific method)
|
|
(Respond to the server or not)
请您参考如下方法:
2 模式进入脑海:命令和访问者:
http://en.wikipedia.org/wiki/Command_pattern
http://en.wikipedia.org/wiki/Visitor_pattern
Abstract Class Command {
executeSomething();
}
Class typeN extends command {
executeSomething() {
//...
}
}
Class typeM extends command {
executeSomething() {
//...
}
}
replace your switch by :
//my old switch
class commandManager {
processCommand() {
for listOf command in a command buffer
{
onCommand(listOfcommand.command)
}
}
onCommandPoped(command type) {
type.executeSomething()
}
}
you can pass parameters to executeSomething, and you can pass another command
the client code :
{
commandN = new CommandN()
commandManager.postCommand( commandN)
}
阅读您的数据包服务器用例后,我认为您可以使用策略模式的变体
http://www.oodesign.com/strategy-pattern.html
您选择在数据包到达时调用的策略
你可以用工厂来 build 它。
但你不会杀死你的开关盒
请记住,一个服务器可以为多个客户端提供服务。如果可能是您的 switch case 比对象实例化更快。




