我没有研究过设计模式,但我愿意打赌有一个我需要做的事情。我正在几棵树上运行一组不同的算法。它们都实现了一个接口:
public interface DistanceMetric {
public double distance(AbstractTree<String> t1, AbstractTree<String> t2);
}
public class concreteDistanceAlgorithmV1 implements DistanceMetric{
public double distance(AbstractTree<String> t1, AbstractTree<String> t2){
// algorithm methods
return distance;
}
}
然而,突然我现在需要两个版本的每个算法,如上所述,第二个是具有第一个树预处理的变体:
public interface DistanceMetricType2 {
public double distance(AbstractTree<String> t);
}
public class concreteDistanceAlgorithmV2 implements DistanceMetricType2{
private Object transformation1;
public concreteDistanceAlgorithmV2(AbstractTree<String> t1){
transformation1 = process(t1);
}
public double distance(AbstractTree<String> t2){
Object transformation2 = process(t2);
//algorithm involving both transformations
return distance;
}
}
必须有比为每个算法制作两个类更好的方法吗?这是策略模式的用途还是类似的?我如何修改我所拥有的更好地利用好的设计原则?
答案 0 :(得分:3)
如果您需要在运行时选择算法,请查看strategy pattern。策略模式提供了所有算法实现的接口。然后,您可以实例化正确的算法并调用其execute()方法。
如果您需要改变算法的各个部分,请查看template method pattern。在模板方法中,对算法的修改会覆盖适当的方法,以提供实现完全相同目标的替代方法。这通常通过使用一个继承的抽象类来完成。
答案 1 :(得分:0)
我认为你是对的,这是利用战略模式的好时机。