【发布时间】:2015-01-19 06:25:43
【问题描述】:
我有控制器根据命令名称执行一些命令,取自 url。要点是不要使用 if 和 switch 子句。据我所知,只有两种方法可以做到 - 1)命令模式 2)反射。
//Command pattern
class Controller{
private HashMap<String,Command> commands;
public void executeCommand(String commandName){
commands.get(commandName).execute();
}
...
}
//reflection
class Controller{
public void readCommand(){
....
}
public void executeCommand(String commandName){
this.getClass().getMethod(commandName+"Command").invoke(this);
}
...
}
所以问题:
- 哪个更好?
- 在一个应用程序中让开发人员使用他们想要的一种方法是否正常。
- 还有其他方法吗?
【问题讨论】:
-
如果用户输入
execute会发生什么?这会导致executeCommand尝试递归调用自己吗?以这种方式使用反射,使用用户输入的字符串来确定要执行的方法名称,看起来非常很危险。不妨在你的程序上贴上一个标语,上面写着“嘿,网络犯罪分子!就是这样!!!” -
@ajb 感谢您的评论。我知道,这就是为什么我们通过 xml 使用 url 映射器(url -> 组件,命令)。我写了“取自 url”来传递这个想法。
标签: java design-patterns reflection command-pattern