segunda-feira, 21 de abril de 2008

Padrões GOF (Padrão Adapter)

Aula 17

Como vamos utilizar a classificação de Metsker para nossos estudos sobre os padrões GOF, nesta postagem apresentaremos o padrão Adapter.

O principal objetivo do Adapter é facilitar a conversão da interface de uma classe para outra interface mais interessante para o cliente, fazendo com que várias classes possam trabalhar em conjunto independentemente das interfaces originais. O Adapter é utilizado quando uma classe já existente e sua interface não combinam com a esperada pelo cliente ou se deseja-se criar uma classe reutilizável que coopera com classes não relacionadas ou não previstas, ou seja, classes q não necessariamente tenham interfaces compatíveis, entre outras utilizações.

O padrão Adapter tem finalidade estrutural e abrange tanto escopo de classe quanto de objeto, por isso existe o adaptador de classe e o adaptador de objetos, o primeiro é utilizado quando o alvo é uma interface, consequentemente usa herança múltipla, o segundo é utilizado quando o alvo é uma classe e faz uso da agregação.

Imagine que utilizamos uma classe utilitária de um framework especializado em métodos para programadores iniciantes, nesta classe existe um método que será depreciado no futuro (sem utilização), ou seja, digamos que novas versões da classe sejam lançadas e o método tenha sido retirado definitivamente, como poderemos utilizar a nova versão da classe em nossa aplicação que utiliza a versão antiga do método? Se apenas substituirmos a classe, será disparado um erro afirmando que está sendo feita uma chamada que não existe.

È aí que entra o padrão adapter, com duas formas para resolver esse problema:

1. Criamos uma classe intermediária que servirá como interface entre as chamadas de código cliente e o código da classe, essa nova classe trabalhará basicamente como um filtro entre essas chamadas, o que caracteriza um adaptador de objetos, utilizando agregação.

2. Criamos uma classe que herdará da antiga e sobrescrevemos ou recriamos o método chamado, caracterizando dessa forma um adaptador de classes, utilizando herança.

A escolha da forma de implementação do adapter é uma decisão do arquiteto de software e dependerá do contexto da aplicação.Utilizaremos aqui a 1ª opção.

Vamos ao exemplo prático:

Imagine que você esteja aprendendo java e já sabe alguns padrões de projeto, então você é um programador iniciante, teremos então a classe INICIANTE.

Esta classe utiliza dois métodos, SlaverJava() que representa apenas os conhecimentos que você tem sobre java e Padrões() que representa os conhecimentos que você tem sobre Padrões.

Suponhamos que daqui um tempo você adquira mais conhecimentos em java, então o método SlaverJava() não terá utilização, além da necessidade de implementar um novo método na classe. Como mencionado anteriormente, se apenas substituirmos a classe, será disparado um erro ao ser feita qualquer chamada para os métodos dessa classe.

A solução seria criar uma nova classe adaptadora contendo uma chamada para uma outra classe que contém o novo método, servindo como interface entre as chamadas de código cliente para os métodos da classe Iniciante, implementando essas chamadas na nova classe.

Criamos então uma nova classe chamada programadorMédio, que seria a nova versão da classe Iniciante, se essa classe apenas herdasse da classe iniciante e reescrevesse esse novos métodos, não seria caracterizado a utilização do padrão adapter e sim uma simples herança. Sendo assim, vamos implementar a classe programadorMedio como uma interface contendo apenas o novo método que irá substituir o SlaverJava.

Criamos então a classe adaptadora, chamada IntermediarioAdapter que herda da classe Iniciante, reescreve o novo método e implementa na classe programadorMedio.


Com isso finalizamos o padrão adapter, um exemplo bem simples mas que explica bem o conceito principal deste padrão.



Download do aplicativo no Netbeans


REFERÊNCIAS

CEFET-PARANÁ, Padrões de Projeto, ARTIGO

Èrico Almeida, IMASTERS fórum, Padrões de Projeto-Adapter

Steven John Metsker, Design Patterns Java Workbook.Addison-Wesley, 2002

3 comentários:

java_br disse...

Belo post!!!
me ajudou bastante!!!
não poderia passar sem deixar um recado.
parabens.

Sergeenho disse...

Realmente um belo post!

Parabens!

Anônimo disse...

Muito lega cabra....
vlw