Faz sentido a classe número ser uma expressão. Conceitualmente um número é uma expressão no contexto da matemática?
Fiz uma outra implementação um pouco diferente na parte dos construtores da classe Soma e Subtração.
package br.com.schimidtsolutions.estudo.interpreter;
public class Programa {
public static void main(final String[] args) {
Expressao numero1 = new Numero(10);
Expressao numero2 = new Numero(30);
Expressao numero3 = new Numero(50);
int resultadoSubtracao = new Subtracao(numero2, numero1).avaliar();
int resultadoSoma = new Soma(new Numero(resultadoSubtracao), numero3).avaliar();
System.out.println(resultadoSoma);
}
}
package br.com.schimidtsolutions.estudo.interpreter;
public class Numero implements Expressao {
private final int numero;
public Numero(final int numero) {
this.numero = numero;
}
@Override
public int avaliar() {
return numero;
}
@Override
public String toString() {
return String.format("Numero [%,d]", numero);
}
}
package br.com.schimidtsolutions.estudo.interpreter;
public class Soma implements Expressao {
private final int numeroEsquerda;
private final int numeroDireita;
public Soma(final Expressao expressaoAEsquerda, final Expressao expressaoADireita) {
numeroEsquerda = expressaoAEsquerda.avaliar();
numeroDireita = expressaoADireita.avaliar();
}
@Override
public int avaliar() {
return numeroEsquerda + numeroDireita;
}
}
package br.com.schimidtsolutions.estudo.interpreter;
public class Subtracao implements Expressao {
private final int numeroEsquerda;
private final int numeroDireita;
public Subtracao(final Expressao expressaoAEsquerda, final Expressao expressaoADireita) {
numeroEsquerda = expressaoAEsquerda.avaliar();
numeroDireita = expressaoADireita.avaliar();
}
@Override
public int avaliar() {
return numeroEsquerda - numeroDireita;
}
}
package br.com.schimidtsolutions.estudo.interpreter;
public interface Expressao {
public int avaliar();
}