策略模式和带接口的变量

时间:2011-08-24 19:29:48

标签: java oop design-patterns

我正在使用这个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;
    }

}

2 个答案:

答案 0 :(得分:1)

public interface EquationInterface {

    public JPanel createParameterPanel();

    public void performSolve();

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

我会使用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;
    }
}

答案 1 :(得分: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";
    }

}


此外,我建议你的设计有另一个改进。看一下EquationInterface界面;它看起来有点厚。它包含getEquationName()performSolve()方法,这些方法很有意义。他们都关注方程的实际功能。但是,使用与createParameterPanel()等UI相关的方法对我来说非常奇怪。该接口现在依赖于JPanel类,并且它以某种方式与UI相关联。我真的会把界面分成两部分; EquationInterface将包含命名和解决方案,而另一个接口将用于创建UI元素。

这也解决了你对策略模式的担忧;现在EquationInterface只会与方程的实际逻辑相关联,包括名称。换句话说,将命名逻辑添加到界面中应该感觉更自然。有关此接口隔离主题的更多详细信息,请参见here.