首页 > 解决方案 > 具有不同输入参数数量的算法的最佳设计模式

问题描述

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

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

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

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

可以说在第一个算法中我只需要经度和第二个经度和纬度。

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

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

标签: javadesign-patterns

解决方案


您可以拥有您的模板,但您可以传递一个类型为 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));

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


推荐阅读