具有不同输入参数数量的算法的最佳设计模式

时间:2018-05-25 12:33:19

标签: java design-patterns

我正在尝试帮助我的朋友完成他的项目,同时这样做我看到他有两个几乎相似的算法实现。

我的第一个想法是使用模板模式。

public abstract class Template {
    calculate();
    save();
}

等等。但是在第二个算法中calculate()save()需要其他参数。两种算法中的两种方法内的代码都是90%的重复。

让我们说在第一个算法中我只需要经度和经度和纬度。

因此,使用模板模式制作它的唯一方法是创建一些具有经度和纬度的对象,并在两种算法中传递它。但是,我不喜欢这个解决方案,因为第二个参数在第一个算法中将为“null”。

也许我没有看到更好,更清洁的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

你可以拥有你的模板,但是你可以传递一个类型为Calculator的对象,并且计算器具有不同数量的参数,例如这样做:

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));

这样您就可以将计算与模板分开。你可以从那里改进 - 例如你可以共享计算器,而不是每次都创建一个新实例。

答案 1 :(得分:0)

您可以尝试将“模板方法”与“策略”模式结合使用。两种模式都关注两种不同观点的算法:关于在运行时交换算法的能力的策略,以及关于灵活化算法结构的模板方法。

对于不同数量的参数,您可以使用方法重载/伸缩或使用包装类参数+ Builder模式。