2009-08-07 63 views
0

我還沒有研究設計模式,但我敢打賭,有一個我需要做的。我在幾棵樹上運行了一套不同的算法。他們都實現一個接口:尋找設計模式

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

備註:您的方法應該採用接口而不是抽象類(AbstractTree)。 – 2009-08-07 20:16:12

+0

不一定,儘管這可能是一個好主意。如果他的所有樹都從AbstractTree繼承,那麼它可能會運行。 – 2009-08-07 23:58:21

回答

3

如果您需要在運行時選擇算法,請查看strategy pattern。策略模式提供了一個所有算法實現的接口。然後,你可以實例化正確的算法並調用它的execute()方法。

如果您需要更改算法的某些部分,請查看template method pattern。在模板方法中,對算法的修改會覆蓋適當的方法以提供實現完全相同目標的替代方法。這通常是通過擁有一個繼承的抽象類來完成的。

0

我認爲你是對的,這是利用策略模式的好時機。