Избегайте условий переключения с помощью шаблонов проектирования - PullRequest
0 голосов
/ 14 июля 2020

У меня есть несколько классов, которые представляют арифметические c операции (Plus, Minus, Pow ...) в Java, которые расширяют один и тот же абстрактный класс Operator, но отличаются одним методом - calculate.

Я пытаюсь найти способ избежать условий переключения, чтобы правильно реализовать эти классы, используя шаблоны проектирования (новые для шаблонов проектирования), но как мне это сделать? Или оператор switch-case - правильный способ его реализовать?

вот абстрактный класс:

public abstract class Operator {

    private int a, b;
    
    public Operator(int a, int b){
        this.a = a;
        this.b = b;
    }
    
    public float calculate() {
        // here I want to return the result depending on the operator. If Plus extends Operator then the returned value is this.a + this.b
    }
    
    public void print() {
        System.out.println("This is the result : %f", this.calculate());
        
    }
}

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

В этом случае нет необходимости в шаблоне проектирования, но достаточно использовать полиморфизм. Измените класс Operator следующим образом:

public abstract class Operator {

    protected int a;
    protected int b;
    
    public Operator(int a, int b){
        this.a = a;
        this.b = b;
    }
    
    public abstract float calculate();
    
    public void print() {
        System.out.println("This is the result : " + this.calculate());
    }
}

А затем реализуйте его с помощью классов Minus и Plus:

public class Plus extends Operator{
    public Plus(int a, int b) {
        super(a, b);
    }
    @Override
    public float calculate() {
        return this.a + this.b;
    }
}

public class Minus extends Operator{
    public Minus(int a, int b) {
        super(a, b);
    }
    @Override
    public float calculate() {
        return this.a - this.b;
    }
}

Это класс Main для теста:

public class Main {
    public static void main(String[] args) {
        Operator minus = new Minus(5,2);
        minus.print(); // prints: This is the result : 3.0
        Operator plus = new Plus(5,2);
        plus.print();  // prints: This is the result : 7.0
    }
}
0 голосов
/ 14 июля 2020

См. Код ниже:

Измените метод расчета на:

public float calculate(){
        // here I want to return the result depending on the operator. If Plus extends Operator then the returned value is this.a + this.b
        if(this instanceof Plus ){
            return a + (float)b;
        }else if(this instanceof Minus ){
            return a - (float)b;
        }//...For Mul and Div you can code
        return 0.0f;
    }

, а после этого вы можете изменить метод печати на:

public void print() {
        System.out.println(String.format("This is the result :  %f", this.calculate()));
    }

и после этого вы можете вызвать это из любого класса, чтобы получить свой результат:

    Operator operator = new Plus(2,5);
    operator.print();
    operator = new Minus(5,2);
    operator.print();

Наконец, выведите:

This is the result:  7.000000
This is the result:  3.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...