шаблон стратегии и переменные с интерфейсами - PullRequest
1 голос
/ 24 августа 2011

У меня есть это Java-приложение, над которым я работаю, чтобы получить больше опыта с шаблонами проектирования и OODesign.Приложение позволяет пользователю выбирать «уравнения» из списка.И тогда пользователю будет предложено указать параметры для выбранного уравнения, и ему будет дана кнопка для решения уравнений.

Я реализую уравнения в виде шаблона стратегии.Я пытаюсь выяснить, как получить имена уравнений в поле со списком.Мне было интересно, есть ли способ для классов Equation, которые реализуют EquationInterface, иметь переменную под названием уравнения.Это позволило бы программисту присвоить конкретному уравнению имя, когда они кодируют класс для этого конкретного уравнения.Код приведен ниже.

Пример: когда программист разрабатывает новое уравнение для добавления в программу, он должен указать имя для созданной стратегии.

Если у вас есть какие-либо вопросы, пожалуйста, дай мне знать.Мне трудно объяснить, что я пытаюсь сделать.И если у вас есть какие-либо предложения относительно лучшего шаблона дизайна или способа достижения этой цели, пожалуйста, сообщите мне.

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 ]

1 голос
/ 25 августа 2011

Я бы пошел с добавлением 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(), выглядит для меня очень странно. Интерфейс теперь зависит от класса JPanel и каким-то образом связан с пользовательским интерфейсом. Я бы действительно разбил интерфейс на две части; EquationInterface будет содержать наименование и решение, в то время как другой интерфейс будет служить для создания элементов пользовательского интерфейса.

Это также отчасти отвечает вашим опасениям по поводу шаблона стратегии; EquationInterface теперь будет связан только с реальной логикой уравнения, включая имя. Другими словами, было бы более естественно добавить логику именования в интерфейс. Подробнее об этой теме разделения интерфейсов можно узнать здесь .

1 голос
/ 24 августа 2011
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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...