我有不同的字符串距離度量實現手頭(所有這些都在C#中),例如,Levensthein,NeedlemanWunsch,Jaccard等。這些工作基本相同;以兩個字符串作爲輸入並返回範圍[0,1]中的相似度分數。所以,我打算讓這些類來實現相同的基本界面,如下所示:什麼是以下情況的良好設計模式?
public interface IStringDistanceMetric
{
//Return a similarity between 0 and 1.
double CompareSimilarity(string strA, string strB);
}
我的每一個指標都將實現此方法。但是有些指標可以直接對兩個字符串進行操作,沒有任何其他輸入,並且有一些指標需要一些額外的參數(例如對輸入字符串之一的間隙進行懲罰等)。一般來說,我可以在構造函數階段或計算相似性分數之前給這些參數。
我的問題是,一般來說,爲了處理具體距離類之間的這種差異,一個好的設計實踐是什麼?我的目標是,在決定使用特定類型的度量標準之後,希望使用任何距離度量標準的客戶端代碼應該忽略任何基礎實現細節。最明顯的辦法是實施類似:
IStringDistanceMetric metric;
if(metricType == Metric.NeedlemanWunsch)
{
metric = new NeedlemanWunsch(parametersNW);
}
else if(metricType == Metric.Levensthein)
{
metric = new Levensthein(parametersL);
}
.
.
.
但是這對我來說不是一個好的解決方案。我有點驚訝地發現自己陷入了這樣一個基本的外觀設計問題。任何幫助,將不勝感激。
你知道你要預先使用哪個嗎?也許一個工廠會更適合在這裏。這樣客戶端只需要一個實例,工廠方法就包含這個「if else」的東西並返回接口。這使得工廠可以訪問參數的假設 - 它總是可以爲這些參數提供參數。還允許您保留您的策略模式,以便返回接口的實現,這很好。 – 2014-10-27 13:07:14
你試圖做這件事的方式沒有錯,你有兩個獨立的alghorithms檢查這兩個字符串。讓他們在不同的功能和使用if來選擇你應該使用哪一個是正確的方式做到這一點。 – Vajura 2014-10-27 13:08:53
同意@AdamHouldsworth。此外,我建議你的客戶端代碼將「stringDistanceMetric」_typed_作爲接口(而不是實際的類類型),因此可以注入不同的具體類型。 – heltonbiker 2014-10-27 13:11:14