2009-08-07 14 views
0

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?

+0

Seitennotiz: Ihre Methoden sollten eine Schnittstelle anstelle einer abstrakten Klasse (AbstractTree) nehmen. –

+0

Nicht unbedingt, obwohl es eine gute Idee wäre. Wenn alle seine Trees von AbstractTree erben, könnte es funktionieren. –

Antwort

3

Wenn Sie den Algorithmus zur Laufzeit auswählen müssen, überprüfen Sie die strategy pattern. Das Strategie-Muster bietet eine Schnittstelle, die alle Algorithmen implementieren. Dann können Sie den richtigen Algorithmus instanziieren und seine execute() -Methode aufrufen.

Wenn Sie Teile eines Algorithmus variieren müssen, überprüfen Sie die template method pattern. In der Schablonemethode überschreiben Änderungen an einem Algorithmus die entsprechenden Methoden, um alternative Möglichkeiten zum Erreichen des gleichen Ziels zu bieten. Dies geschieht in der Regel durch eine abstrakte Klasse, die vererbt wird.

0

Ich denke, Sie haben Recht, dies ist eine gute Zeit, um das Strategie-Muster zu nutzen.

Verwandte Themen