Olá, Irene não sei se entendi bem sua dúvida.
Inicialmente a varíavel desconto é do tipo DescontoParaOrcamentoComMaisDeCincoItens. Então na linha return desconto.calcular(orcamento);
estaremos chamando o método calcular() de DescontoParaOrcamentoComMaisDeCincoItens, que caso o desconto seja aplicável, entra no if e
sua execução para por aí, encerrando-se a cadeia logo no primeiro objeto(DescontoParaOrcamentoComMaisDeCincoItens).
Porém se o desconto não for aplicável, será retornado a chamada proximo.calcular() e nesse ponto o objeto proximo é do tipo DescontoParaOrcamentoComValorMaiorQueQuinhentos pois foi ele que passamos para o construtor de DescontoParaOrcamentoComMaisDeCincoItens. Caso o desconto seja aplicável entra no if e sua execução para por aí, encerrando-se a cadeia no segundo objeto(DescontoParaOrcamentoComValorMaiorQueQuinhentos).
E finalmente se o desconto não for aplicável, será retornado a chamada proximo.calcular(), onde nesse momento proximo é um objeto do tipo SemDesconto, pois foi ele que passamos para o construtor de DescontoParaOrcamentoComValorMaiorQueQuinhentos.
Espero ter ajudado :)