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