Ich habe Designmuster nicht studiert, aber ich wette, dass es einen für das gibt, was ich tun muss. Ich betreibe eine Reihe verschiedener Algorithmen über ein paar Bäume. Sie alle eine Schnittstelle implementieren:Auf der Suche nach einem Designmuster
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;
}
}
jedoch plötzlich jetzt brauche ich zwei Versionen jeder Algorithmus ein, wie oben und die zweite ist eine Variante, die den ersten Baum hat vorverarbeitet:
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;
}
}
Es muss sein ein besserer Weg als zwei Klassen für jeden Algorithmus zu machen? Ist dies eine Verwendung für das Strategie-Muster oder ähnliches? Wie kann ich ändern, was ich brauche, um gute Designprinzipien besser zu nutzen?
Seitennotiz: Ihre Methoden sollten eine Schnittstelle anstelle einer abstrakten Klasse (AbstractTree) nehmen. –
Nicht unbedingt, obwohl es eine gute Idee wäre. Wenn alle seine Trees von AbstractTree erben, könnte es funktionieren. –