AN>
Projeto
Decorando objetos
No artigo anterior - Objetos também são hospitaleiros - desenvolvemos um renderizador de provas para a empresa ABC. Para cada renderizador criamos um objeto que visitava todos os elementos da estrutura da prova acumulando conhecimentos. O visitante acrescia regras de negócio e comportamentos aos objetos visitados dinamicamente e o melhor, sem que o visitado precisasse ser alterado. Para tornar isso possível foi necessário abordarmos alguns princípios de orientação a objetos e o padrão Visitor. Vale apena conferir.
Nesse artigo daremos continuidade à série de padrões de projetos. Dessa vez vamos aprender técnicas de decoração de objetos.
É importante ressaltar que embora estejamos utilizando Java para exemplificar códigos, essas técnicas são extensíveis a quase todas as linguagens orientadas a objetos.
Será considerado que o leitor possui alguma noção de orientação a objetos, Java e HTML.
Utilizaremos um exemplo didático para demonstrar o funcionamento das técnicas de decoração, mas esse exemplo, apesar da sua simplicidade, é poderoso e poderá ser entendido e melhorado para uso em sistemas reais.
O problema
Recebemos uma encomenda especial do nosso cliente. A Design W3 precisa gerar páginas HTML respeitando dois requisitos abrangentes: simplicidade e flexibilidade. A simplicidade se refere à criação e manutenção dessas páginas HTML. A flexibilidade se refere à criação e manutenção dos componentes (elementos da página, tais botões, labels, textos, dentre outros).
A solução
Vamos partir da seguinte idéia, precisamos criar componentes em Java que representem os componentes HTML. Para simplificar vamos criar somente as seguintes classes: Button, CheckBox, Div e Fieldset. Como todas essas classes são componentes, criaremos uma classe genérica que as representem, conforme mostra a Listagem 1.
Listagem 1. Implementação da classe Componente
public abstract class Componente {
public abstract String getHTML();
public String toString() {
return getHTML();
}
}
A classe da Listagem 1 tem como propósito generalizar nosso conceito de componente, ou seja, classes como Button, Checkbox e outras deverão herdar de Componente que, por sua vez, possui apenas um método abstrato, o getHTML(). Esse método é o serviço que gera o HTML de um componente específico, por isso ele precisa ser implementado na subclasse, pois somente ela sabe como se desenhar.
O método toString() foi sobrecarregado de modo a retornar o HTML do componente.