首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令模式与反射

命令模式与反射
EN

Stack Overflow用户
提问于 2014-11-21 06:55:02
回答 3查看 1.6K关注 0票数 7

我有控制器,它根据命令名执行一些命令,从url获取。要点是不要使用if和switch子句。据我所知,如何做到这一点只有两种方法-- 1)命令模式,2)反射。

代码语言:javascript
复制
//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);
  }
  ...
}

所以问题是:

  1. 哪一个更好?
  2. 在一个应用程序中允许开发人员使用他们想要的方法之一是正常的吗?
  3. 还有别的办法吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-21 07:00:16

  1. 第一种方法更好,只有在没有其他选择的情况下才使用反射。
  2. 在一个应用程序中,应该有一种方法来解决一种问题。
  3. 我认为第一种方法很好。(比if/else块好得多)
票数 4
EN

Stack Overflow用户

发布于 2016-02-11 15:30:40

哪一个更好?

显然第一个更好。即使您引用了您正在使用的命令模式,但它并不是完整的“命令”模式。命令模式将有命令(摘要)、具体命令、接收方、调用方和客户端。

看看这个问题:

使用命令设计模式

除了彭定康指挥外,我想强调反思的利弊。

Pros:

  1. 处理依赖注入
  2. 开发即插即用框架

Cons:

  1. 反射调用比较慢。
  2. 您可能会违反安全性,并以坏的意图引爆应用程序(例如,设置类的私有变量,其他类是不可见的)。

看一看有关反射的SE问题:

什么是反射,为什么它是有用的?

在一个应用程序中允许开发人员使用他们想要的方法之一是正常的吗?

对于开发人员来说,选择最佳的方法来解决特定的问题是正常的。

还有别的办法吗?

这取决于你要解决的问题的类型。设计模式为反复出现的问题提供了解决方案。

所有解决方案都不能适用于现有的设计模式。您可能已经开发了解决问题的新模式。

票数 1
EN

Stack Overflow用户

发布于 2014-11-21 08:31:56

我认为你的第一种方法有两种不同的方法。每个命令都可以是抽象类命令的子类。或者每个命令都可以是类命令的一个实例。这取决于这一切应该具有多大的灵活性,以及命令的are参数和返回值吗?有了子类,它将如下所示(只是为了得到这个想法):

代码语言:javascript
复制
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) {}
    }
}

以下是我的答案:

  1. 你的第一条路更好。总是喜欢设计模式而不是反射。
  2. 对不起,我不明白第二个问题。但它没有问号,所以我跳过它:)
  3. 您可能需要查看战略设计模式,其中每个命令甚至可以由子命令的不同部分组成。另一个想法是工厂设计模式。在这种情况下,您需要将每个命令放入一个类中,然后使用ClassLoader按名称加载该类。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27055752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档