Oi Victor, tudo bom?
Realmente, a classe Calculadora está acoplada ao Orcamento. Isso porque no nosso modelo o Orcamento é quem encapsula o valor. Poderiamos tornar esse código mais desacoplado se criassemos uma interface para relacionar classes responsaveis por encapsular valores. Algo como:
public interface Orcavel{
public double getValor();
}
E implementassemos na classe Orcamento:
public class Orcamento implements Orcavel{
// implementação da classe Orcamento
}
Assim, poderiamos trabalhar com a interface:
public class CalculadorDeImposto {
public void calcula(Orcavel orcamento, Imposto estrategiaDeImposto) {
double resultado = estrategiaDeImposto.calcula(orcamento);
System.out.println(resultado);
}
}
public class ISS implements Imposto {
public double calcula(Orcavel orcamento) {
return orcamento.getValor() * 0.06;
}
}
Assim, o imposto poderia receber qualquer coisa orçavel, não só um Orcamento. Como, no nosso sistema temos apenas uma classe com essa responsabilidade não havia a necessidade de extrair uma interface apenas para essa classe.
Criar mais interfaces implica em tronar nosso código mais complexo. Ao mesmo tempo também tornamos menos acoplado o código sempre que trabalhamos voltados à interfaces.
Sempre abrimos mão de algo para ganhar outra coisa, nesse caso abrimos mão de um pouco mais de complexidade porque o acoplamento teria pouco impacto no nosso modelo já que defiminos o Orcamento como o responsavel (e, provavelmente seria suficiente) de lidar com os valores.
Espero ter ajudado =)
Abraço e bons estudos.