Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 1 da Aula 5 - Estados que variam e o State

Boa tarde, Não entendi porque a classe Orçamento "repete" os métodos da classe EstadoDeUmOrcamento. Se a classe Orçamento implementasse a interface EstadoDeUmOrcamento não estaria correto?

public class Orcamento {

    protected EstadoDeUmOrcamento estadoAtual;

    //...

 //repete este método
    public void aplicaDescontoExtra() {
    estadoAtual.aplicaDescontoExtra(this);
    }

 //repete este método
    public void aprova() {
        this.estadoAtual.aprova(this);
    }

 //repete este método
    public void reprova() {
        this.estadoAtual.reprova(this);
    }

 //repete este método
    public void finaliza() {
        this.estadoAtual.finaliza(this);
    }
}
4 respostas

Olá Rodrigo! Veja bem, se você implementar a classe Orcamento com a interface EstadoDeUmOrcamento não iria fazer muito sentido. Veja que um orçamento deve possuir um estado e não ser um estado. Então é criado um atributo do tipo EstadoDeUmOrcamento, chamado estadoAtual, para a classe Orcamento. Perceba que cada estado possui seu própria regra de negócio para aprovar, reprova, finalizar e etc.. assim é delegado os métodos da classe Orcamento aos métodos correspondentes do estadoAtual e então será aplicada uma regra de negócio de acordo com o estado que o orçamento se encontra.

Espero ter ajudado! Caso tenha dúvida, só perguntar. Bons Estudos!

Olá Romário, entendi! Só fiquei um pouco confuso porque tem que escrever os mesmos métodos da interface na classe Orcamento. Entendi que esses métodos "repetidos" são os que delegam para o atributo Estado. Mas isso não faz com que haja um possível "esquecimento" do codificador? Ou seja, nem tudo poderia ser delegado. Existe outra forma de fazer isso? Achei um tanto complicado para entender.

solução!

Como assim "esquecimento"? Você se refere ao fato de todos os métodos não serem passados, mas sim dependerem do programador?

Caso seja isso, você está certo. Isso é uma forma de relação bastante utilizada se chama HAS-A (TER-UM) e é diferente da comumente utilizada que é IS-A (SER - UM).

A relação HAS-A é bastante utilizada quando realmente queremos que nossa classe não possua todos os métodos da classe que ela tem uma relação. Por isso fica a cargo do programador colocar os métodos que deseja.

Para esse exemplo do State creio que não foi isso que foi objetivado, mas sim manter a semântica como falei anteriormente. É um pouco complicado de entender inicialmente, mas com a prática você aprenderá e verá que nem é tão difícil.

Esperto ter ajudado! Bons estudos!

Certo, agora entendi perfeitamente. Obrigado!