2011-08-24 60 views
1

我有一個這個Java應用程序,我正在努力獲得更多設計模式和OODesign的經驗。該應用程序允許用戶從列表中選擇「方程式」。然後用戶將被提示參數爲選定的公式,並將被給予一個按鈕來解決方程。策略模式和接口變量

我正在實施方程式作爲策略模式。我想弄清楚如何將方程的名稱放入列表框中。我想知道是否有方法實現EquationInterface的Equation類有一個名爲equationName的變量。這將允許程序員在爲特定方程編寫類時爲其指定特定方程。代碼如下所示。

示例:當程序員正在設計一個添加到程序中的新公式時,他們需要包含所創建策略的名稱。

如果您有任何問題,請讓我知道。我很難解釋我正在努力完成什麼。如果您對使用更好的設計模式或完成此目標的方式有任何建議,請告訴我。

public class Equation { 
    public enum equationList { 
     DISTANCETRAVELLEDFALLINGOVERTIME, 
     TIMEFOROBJECTFALLDISTANCE 
    } 

    private EquationInterface solveInterface; 

    public Equation(EquationInterface solveInterface) { 
     this.solveInterface = solveInterface; 
    } 

    public void solve() { 
     solveInterface.performSolve(); 
    } 

    public JPanel getParameterPanel() { 
     return solveInterface.createParameterPanel(); 
    } 
} 

public interface EquationInterface { 

    public JPanel createParameterPanel(); 

    public void performSolve(); 
} 

public class DistanceTravelledFallingOverTime implements EquationInterface { 

    @Override 
    public void performSolve() { 
     // TODO Auto-generated method stub 
     System.out.println("DistanceTravelledFallingOverTime"); 
    } 

    @Override 
    public JPanel createParameterPanel() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 
+0

是否有某些東西阻止你讓'EquationInterface'包含'getEquationName()'方法? – StriplingWarrior

回答

1
public interface EquationInterface { 

    public JPanel createParameterPanel(); 

    public void performSolve(); 

    public void setEquationName(String equationName); 
    public String getEquationName(); 
} 

我會使用來代替可變吸氣型方法。

一個樣本實現

public class SampleEquation implements EquationInterface { 

    public JPanel createParameterPanel(){return null;} 

    public void performSolve(){ 
    //solving an equation 
    } 

    private String equationName = "MyDefaultEquationName";// or = null 

    public void setEquationName(String equationName){ 
     this.equationName = equationName; 
    } 

    public String getEquationName(){ 
     return this.equationName; 
    } 
} 
+0

EquationName變量會直接與創建的方程相關聯嗎?什麼變量將「getEquationName()」檢索? – prolink007

+0

編碼器是否必須將變量添加到他/她添加的每個單獨方程中? – prolink007

+0

如果您不想重複自己(DRY原則),則一種方法是使用Abstract類而不是接口。或者,您必須在實現EquationInterface的類中提供私有字符串方程式名稱。 – fiction

1

我會添加一個getEquationName()EquationInterface接口去:

public interface EquationInterface { 

    public JPanel createParameterPanel(); 

    public void performSolve(); 

    public String getEquationName(); 
} 

樣品實施會是什麼樣子:

public class DistanceTravelledFallingOverTime implements EquationInterface { 

    @Override 
    public void performSolve() { 
     // TODO Auto-generated method stub 
     System.out.println("DistanceTravelledFallingOverTime"); 
    } 

    @Override 
    public JPanel createParameterPanel() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public String getEquationName(){ 
     return "Distance Travelled Falling Over Time"; 
    } 

} 


Furtherm礦石,我會建議你的設計的另一個改進。看看EquationInterface界面;它對我來說看起來有點厚。它包含getEquationName()performSolve()方法,這些方法很有意義。他們都關心方程的實際功能。但是,使用UI相關的方法(如createParameterPanel())對我來說看起來很奇怪。該界面現在依賴於JPanel類,它以某種方式綁定到UI。我真的會把界面分成兩個; EquationInterface將包含命名和解決方案,而另一個接口將用作創建UI元素。

這也可以回答您對戰略模式的擔憂; EquationInterface現在只會與等式的實際邏輯關聯,包括名稱。換句話說,將命名邏輯添加到界面應該感覺更自然。有關界面隔離這個主題的更多細節可以發現here.

+0

我需要參數面板來包含與特定方程相關的參數。所以,如果編碼員想要添加一個新的等式,他們將不得不創建方程類,然後將他們的代碼添加到他們想要jpanel的樣子中。每個方程式可能有不同數量的參數,所以當我們創建方程式時,我會將它留給方程創建者來創建面板,他們會使用求解方法來抓取它們所創建的面板上的所有輸入。 ..我需要爲此做些什麼? – prolink007

+0

它是有道理的''EquationInterface'包含參數的邏輯;參數是等式的重要組成部分。但是,JPanel耦合是個問題。下面是你可以做的:創建一個名爲'EquationParameter'的類,並將'List getParameters()'方法添加到'EquationInterface'接口。請注意,接口如何與3種解耦方法一致:getName,getParameters,performSolve。等式實現必須提供名稱和參數以及解決方案;非常自然。 – Guven

+0

這種方法的另一個好處:現在可以在一個地方處理JPanel創建和修改代碼。具體的等式實現不需要處理JPanel;他們只需要創建'EquationParameter'的實例。將會有一個代碼(更像是一個實用程序代碼),它接收這個等式參數列表並從中創建JPanel。 – Guven