Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 策略模式和带有接口的变量_Java_Oop_Design Patterns - Fatal编程技术网

Java 策略模式和带有接口的变量

Java 策略模式和带有接口的变量,java,oop,design-patterns,Java,Oop,Design Patterns,我正在开发这个java应用程序,以获得更多的设计模式和OOD设计经验。应用程序允许用户从列表中选择“方程式”。然后,系统将提示用户所选方程的参数,并给用户一个按钮以按下求解方程 我将这些等式作为一种策略模式来实现。我正试图找出如何将方程式的名称放入列表框中。我想知道实现EquationInterface的Equation类是否有一个名为equationName的变量。这将允许程序员在为特定方程式编写类时为特定方程式指定一个名称。代码如下所示 示例:当程序员设计一个新的等式添加到程序中时,他们需要

我正在开发这个java应用程序,以获得更多的设计模式和OOD设计经验。应用程序允许用户从列表中选择“方程式”。然后,系统将提示用户所选方程的参数,并给用户一个按钮以按下求解方程

我将这些等式作为一种策略模式来实现。我正试图找出如何将方程式的名称放入列表框中。我想知道实现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();
    }
}


我将使用getter类型方法而不是变量

一个示例实现

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;
    }
}

我会在
EquationInterface
界面中添加一个
getEquationName()

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";
    }

}

此外,我建议对您的设计进行另一项改进。查看
等式接口
接口;我觉得它有点厚。它包含非常有意义的
getequalationname()
performSolve()
方法。它们都与方程的实际功能有关。然而,拥有一个与UI相关的方法,比如
createParameterPanel()
,对我来说看起来很奇怪。该接口现在依赖于
JPanel
类,并且以某种方式与UI绑定。我真的会把界面一分为二
EquationInterface
将包含命名和解决方案,而另一个界面将用作创建UI元素。


这也回答了你对战略模式的担忧;现在,
equalationInterface
将只链接到等式的实际逻辑,包括名称。换句话说,将命名逻辑添加到接口中应该感觉更自然。有关接口隔离的更多详细信息,请参见

是否存在阻止您使用
EquationInterface
包含
getEquationName()
方法的因素?EquationName变量将直接与所创建的方程关联在何处?“getEquationName()”将检索什么变量?编码人员是否只需在他/她添加的每个单独的等式中包含该变量?如果不想重复,一种方法是使用抽象类而不是接口(DRY原则)。或者必须在实现EquationInterface的类中提供私有字符串equationName。这就是我所认为的选项。我试图在这个实现中不使用抽象类。一个漫长的早晨,大脑受伤了。。。谢谢你的帮助!我需要参数面板包含与特定方程式相关的参数。因此,如果程序员想要添加一个新的等式,他们必须创建等式类,然后添加他们希望jpanel看起来像的代码。每个方程都可能有不同数量的参数,所以我打算让方程创建者在创建方程类时创建面板,他们将使用solve方法从他们装箱的面板中获取所有输入。。。我需要为此做些什么呢?
equalationInterface
包含参数逻辑,这是有道理的;参数是方程的重要组成部分。然而,JPanel耦合是一个问题。下面是您可以执行的操作:创建一个名为
EquationParameter
的类,并将方法
List getParameters()
添加到
EquationInterface
接口。请注意,该接口与3种解耦方法的一致性:getName、getParameters和performSolve。等式实现必须提供名称、参数和解决方案;非常自然。这种方法的另一个优点是:现在可以在一个地方处理JPanel创建和修改代码。具体的等式实现不必处理JPanel;他们只需要创建
equalationParameter
的实例。将会有一个代码(更像是一个实用程序代码)获取这个等式参数列表并从中创建JPanel。
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;
    }
}
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";
    }

}