Eu estava lendo um artigo de programação e ele mencionava o padrão Decorator. Venho programando há algum tempo, mas sem nenhum tipo de educação ou treinamento formal, mas estou tentando aprender sobre os padrões padrão e tal.
Então, procurei o Decorator e encontrei um artigo da Wikipedia sobre ele. Agora eu entendo o conceito do padrão Decorator, mas fiquei um pouco confuso com esta passagem:
Como exemplo, considere uma janela em um sistema de janelas. Para permitir a rolagem do conteúdo da janela, podemos adicionar barras de rolagem horizontais ou verticais, conforme apropriado. Suponha que janelas sejam representadas por instâncias da classe Window e assuma que essa classe não tem funcionalidade para adicionar barras de rolagem. Poderíamos criar uma subclasse ScrollingWindow que os fornecesse ou criar um ScrollingWindowDecorator que adiciona essa funcionalidade aos objetos Window existentes. Nesse ponto, qualquer uma das soluções estaria bem.
Agora vamos supor que também desejamos a capacidade de adicionar bordas às nossas janelas. Novamente, nossa classe original do Window não tem suporte. A subclasse ScrollingWindow agora apresenta um problema, porque criou efetivamente um novo tipo de janela. Se desejarmos adicionar suporte de borda a todas as janelas, devemos criar as subclasses WindowWithBorder e ScrollingWindowWithBorder. Obviamente, esse problema piora a cada novo recurso a ser adicionado. Para a solução do decorador, simplesmente criamos um novo BorderedWindowDecorator - em tempo de execução, podemos decorar janelas existentes com o ScrollingWindowDecorator ou o BorderedWindowDecorator ou ambos, conforme entendermos.
OK, quando eles dizem adicionar bordas a todas as janelas, por que não adicionar funcionalidade à classe Window original para permitir a opção? A meu ver, a subclasse é apenas para adicionar funcionalidades específicas a uma classe ou substituir um método de classe. Se eu precisasse adicionar funcionalidade a todos os objetos existentes, por que não modificaria a superclasse para fazer isso?
Havia outra linha no artigo:
O padrão do decorador é uma alternativa à subclassificação. A subclasse adiciona comportamento em tempo de compilação, e a alteração afeta todas as instâncias da classe original; a decoração pode fornecer um novo comportamento em tempo de execução para objetos individuais.
Não entendo onde eles dizem "... a mudança afeta todas as instâncias da classe original" - como a subclasse altera a classe pai? Não é esse o objetivo da subclasse?
Eu vou assumir que o artigo, como muitos Wiki, simplesmente não está escrito claramente. Eu posso ver a utilidade do Decorator nessa última linha - "... forneça um novo comportamento em tempo de execução para objetos individuais".
Sem ter lido sobre esse padrão, se eu precisasse alterar o comportamento em tempo de execução de objetos individuais, provavelmente teria construído alguns métodos na super ou subclasse para ativar / desativar o referido comportamento. Por favor, ajude-me a entender realmente a utilidade do Decorador e por que meu pensamento de novato é falho?