手柄操作员的动态程序

绝不

我有一个处理数学运算符(+,*,-,/)的程序。我有一个接口Operator,它具有如下计算方法:

public interface Operator
{
    double calculate(double firstNumber,double secondNumber);
}

我有四个类(Plus,Minus,Divide,Multiply)实现了Operator接口,如下所示:

public class Plus implements Operator
{   
    public double calculate(double firstNumber,double secondNumber)
    {
        return firstNumber + secondNumber;
    }
}

public class Minus implements Operator
{
    public double calculate(double firstNumber,double secondNumber)
    {
        return firstNumber - secondNumber;
    }
}

等等...

我使用Map处理运算符:

static Map<String,Operator> operatorMap = new HashMap<String,Operator>();
static
{
    operatorMap.put("+", new Plus());
    operatorMap.put("-", new Minus());
    operatorMap.put("*", new Multiply());
    operatorMap.put("/", new Divide());
}

double output = operatorMap.get(op).calculate(firstNumber,secondNumber);

我应该像这样更改程序:

我有一个文件夹(myfolder),每个人都可以获取接口并实现自己的运算符并将.class文件放入myfolder中。我的程序也应该可以工作,这意味着对(+,*,-,/)的依赖关系应该从我的程序中删除。例如,有人获得了Operator界面并实现了%并将.class文件放在我的文件夹中,我的程序仍然可以运行(地图实现必须更改)有人可以帮助我吗?非常感谢。

塔伦·古普塔

因此,您的意思是您将为新的操作员创建一个新的类,程序将自动选择该类。在这种情况下,您可以使用Reflection API遍历实现Operator接口的可用类。然后将它们添加到您的地图中。

要删除对hashmap的依赖关系,可以在Operator界面中添加一个新方法,如下所示:

public interface Operator
{
  double calculate(double firstNumber,double secondNumber);
  char getSign();
}

所有类似Plus,Minus的类都将返回一个映射到其符号的char。

public class Plus implements Operator
{   
  public double calculate(double firstNumber,double secondNumber)
  {
     return firstNumber + secondNumber;
  }
  public char getSign()
  {
     return '+';
  }
}

接下来,在您的calculate(char operator, int operand1, int operand2)方法中,您可以首先遍历实现Operator接口的所有类(使用反射),然后调用get sign并将其与传递给此方法的operator参数进行比较,如果符号与operator匹配,则将操作数传递给Operator。 compute()方法。要获取实现操作员接口的所有类,可以使用以下代码:

Reflections reflections = new Reflections("mypackage");
Set<Class<? extends Operator>> classes = reflections.getSubTypesOf(Operator.class);

希望你现在有了主意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章