A estratégia mostrada durante a aula é muito boa, porém em alguma hora alguém terá que instanciar uma classe de imposto e passar para o Calculador de Impostos junto com o orçamento. A partir disso me veio a dúvida, como fazer isso sem recorrer a if's e comparação? Porque na aula foi simplesmente o utilizado o método main e os impostos foram passados "na mão". Como proceder em casos onde estaríamos em um contexto web, ou uma aplicação desktop, ou ainda uma rotina de cálculo em segundo plano, e não há uma relação entre orçamento e imposto no banco de dados.
Segue demonstração do casos acima em um contexto Web (o contexto desktop seria quase a mesma coisa).
Estamos em uma página web, o usuário cadastra o orçamento em um formulário e seleciona o tipo de imposto em um campo "select". Imagine que não há banco de dados. O servidor deveria percorrer uma lista, que tenderia a crescer para sempre, comparar o imposto escolhido para poder criar a instância de imposto e associar a um orçamento.
No caso de uma rotina de segundo plano as coisas seriam meio diferentes:
Eu tenho um orçamento e um imposto, mas supomos que não estou em um banco de dados, consequentemente não posso dispor da ajuda de uma ORM para o método getImposto(). Suponhamos que eu carregue esses dados de um .csv ainda assim precisaria olhar para o imposto e percorrer uma cadeia de if's para decidir qual instanciar.
E mais um agravante, em nenhum dos casos acima posso utilizar metaprogramação (Reflection).
Difícil? Sim kk, mas por favor me matem essa dúvida, porque para mim é impossível.