我正在尝试帮助我的朋友完成他的项目,同时这样做我看到他有两个几乎相似的算法实现。
我的第一个想法是使用模板模式。
public abstract class Template {
calculate();
save();
}
等等。但是在第二个算法中calculate()
和save()
需要其他参数。两种算法中的两种方法内的代码都是90%的重复。
让我们说在第一个算法中我只需要经度和经度和纬度。
因此,使用模板模式制作它的唯一方法是创建一些具有经度和纬度的对象,并在两种算法中传递它。但是,我不喜欢这个解决方案,因为第二个参数在第一个算法中将为“null”。
也许我没有看到更好,更清洁的方法来解决这个问题?
答案 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模式。