Olá Cristian,
Entendi sua dúvida sobre o padrão Decorator e a possibilidade de incluir novas implementações de impostos sem alterar a interface Imposto e suas implementações.
Uma solução para isso seria criar uma nova classe que implementa a interface Imposto e recebe no construtor uma instância da classe que implementa o imposto original. Essa nova classe adicionaria o novo comportamento ao imposto original sem alterar sua implementação original.
Por exemplo, suponha que você tenha uma classe ImpostoA implementando a interface Imposto. Para adicionar um novo comportamento a essa classe sem alterá-la, você poderia criar uma nova classe ImpostoADecorator que também implementa a interface Imposto e recebe no construtor uma instância de ImpostoA. Essa nova classe adicionaria o novo comportamento ao ImpostoA sem alterar sua implementação original.
No padrão Decorator, a ideia é estender o comportamento de um objeto sem precisar modificar sua interface ou suas subclasses. No entanto, ao utilizar o padrão Decorator, é necessário alterar a estrutura das classes para permitir a composição de objetos decorados.
Normalmente, você precisa criar uma classe abstrata (ou uma interface) que representa a interface base do objeto que será decorado. Essa classe abstrata pode ter implementações concretas básicas do comportamento e pode ser estendida por classes concretas que adicionam comportamentos extras.
No caso específico do exemplo do curso que você mencionou, em que é aplicado o padrão Decorator para calcular impostos, é necessário modificar a estrutura das classes para permitir a composição dos impostos decorados. A classe Imposto é uma interface que representa a base para os impostos, e as subclasses concretas como ISS, ICMS, etc., implementam essa interface.
Para adicionar novos impostos sem modificar a interface Imposto e suas implementações existentes, você pode criar novas classes concretas que implementam a interface Imposto. Cada nova classe representará um novo imposto específico. Em seguida, você pode utilizar essas novas classes concretas junto com os decorators existentes para combinar os comportamentos conforme necessário.
Em resumo, embora seja possível adicionar novas implementações de impostos sem modificar a interface e as implementações existentes, a estrutura das classes deve ser adaptada para permitir a composição dos impostos decorados. É assim que o padrão Decorator permite estender o comportamento de objetos de forma flexível e modular.
Espero ter ajudado e bons estudos!