我有一个处理数学运算符(+,*,-,/)的程序。我有一个接口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] 删除。
我来说两句