我正在尝试帮助我的 friend 完成他的项目,同时我看到他实现了 2 个几乎相似的算法。
我的第一个想法是使用模板模式。
public abstract class Template {
calculate();
save();
}
等等。然而,在第二种算法中,calculate()
和 save()
需要额外的参数。两种算法中两种方法内的代码有 90% 是重复的。
假设在第一个算法中我只需要经度,而在第二个算法中我需要经度和纬度。
因此,使用模板模式的唯一方法是创建一些具有经度和纬度的对象,并将其传递到两种算法中。但是,我不喜欢这个解决方案,因为第二个参数在第一个算法中将为“空”。
也许我没有找到更好、更干净的方法来解决这个问题?
最佳答案
您可以拥有模板,但可以传递计算器类型的对象并拥有具有不同数量参数的计算器,例如这样做:
public class Template {
calculate(ICalculator calculator);
}
interface ICalculator(){
double calculate();
}
然后你就可以拥有不同类型的计算器:
class OneParameterCalculator implements ICalculator{
private final double latitude;
public OneParameterCalculator(double latitude){ this.latitude=latitude; }
public double calculate(){
....
}
}
class TwoParameterCalculator implements ICalculator{
private final double latitude;
private final double longtitude;
public TwoParameterCalculator (double latitude,double longtitude){ this.latitude=latitude; this.longtitude=longtitude; }
public double calculate(){
....
}
}
然后您可以使用模板实例,例如:
myTemplate.calculate(new OneParameterCalculator(latitudeValue));
这样您就可以将计算与模板分开。您可以从那里进行改进 - 例如,您可以共享计算器,而不是每次都创建一个新实例。
关于java - 不同输入参数数量的算法的最佳设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529342/