我有控制器,它根据命令名执行一些命令,从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);
}
...
}所以问题是:
发布于 2014-11-21 07:00:16
发布于 2016-02-11 15:30:40
哪一个更好?
显然第一个更好。即使您引用了您正在使用的命令模式,但它并不是完整的“命令”模式。命令模式将有命令(摘要)、具体命令、接收方、调用方和客户端。
看看这个问题:
除了彭定康指挥外,我想强调反思的利弊。
Pros:
Cons:
看一看有关反射的SE问题:
在一个应用程序中允许开发人员使用他们想要的方法之一是正常的吗?
对于开发人员来说,选择最佳的方法来解决特定的问题是正常的。
还有别的办法吗?
这取决于你要解决的问题的类型。设计模式为反复出现的问题提供了解决方案。
所有解决方案都不能适用于现有的设计模式。您可能已经开发了解决问题的新模式。
发布于 2014-11-21 08:31:56
我认为你的第一种方法有两种不同的方法。每个命令都可以是抽象类命令的子类。或者每个命令都可以是类命令的一个实例。这取决于这一切应该具有多大的灵活性,以及命令的are参数和返回值吗?有了子类,它将如下所示(只是为了得到这个想法):
abstract public class Command {
abstract public void execute();
}
public class LsCommand extends Command
{
@Override
public void execute() {
try {
Runtime.getRuntime().exec("ls");
} catch (IOException e) {}
}
}
public class ChdirCommand extends Command
{
@Override
public void execute() {
try {
Runtime.getRuntime().exec("chdir");
} catch (IOException e) {}
}
}以下是我的答案:
https://stackoverflow.com/questions/27055752
复制相似问题