Padrões de projeto GRASP
Na área científica definimos polimorfismo como sendo uma propriedade que possui certas substâncias com a capacidade de se apresentarem sob muitas formas, sem mudarem de natureza, ou seja, de tipo. Em que esse pequeno parágrafo tem a ver com o design pattern polimorfismo? Segundo os autores do livro Core Java, Cornell & Horstmann, polimorfismo é a capacidade de um objeto decidir qual método aplicará a si mesmo, dependendo de onde se encontra na hierarquia de herança. Complementando a ideia dos autores, podemos dizer em outras palavras que polimorfismo é a capacidade de um objeto de se transformar em outros objetos, dependendo do contexto onde está sendo aplicado, sem mudar o seu tipo, isso ocorre através dos métodos que são herdados de uma superclasse. O questionamento que leva ao uso do polimorfismo é: como criar componentes de softwares conectáveis com base no tipo? Supomos que temos uma classe que faz três diferentes tipos de ações, imagine que outra classe sempre disparasse chamadas a essa classe, solicitando a execução de uma dessas ações, ou seja, quando chega a mensagem, teríamos sempre que testar qual seria o tipo de ação a ser executada, e só então executá-la.
If tipoação 1
...
Else
If tipoação 2
...
O design pattern polimorfismo prega que nunca teste o tipo de um objeto nem use condições lógicas no código para executar alternativas com base no tipo. Por quê? Respondo com outra pergunta. E se o tipo mudar?
Com base no exemplo dado pelo Wikipédia vamos considerar a seguinte classe escrita em Java:
Esta é uma classe abstrata que representa qualquer operação matemática. Existem várias operações matemáticas, com isso não podemos ficar testando uma por uma. Note que, mesmo que a natureza do cálculo mude, a semântica do método calcular não muda, ou seja, ele sempre calculará o resultado da operação matemática que está sendo trabalhada.