[1] O padrão Adaptador permite que classes com interfaces incompatíveis trabalhem juntas através da conversão da interface de uma classe em outra interface. [2] Existem duas formas de implementar o Adaptador: através de herança ou composição. [3] O documento apresenta um exemplo em que um Adaptador converte a interface de um objeto TextView para a interface Shape esperada por um cliente.
2. Adaptador
• Converte a interface de uma classe em
uma outra interface que o cliente espera.
• O adaptador permite que classes que
possuem interfaces incompatíveis
trabalhem juntas
• Também conhecido como Wrapper
2 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
3. Motivação
• Às vezes um toolkit que é projetado para reuso
não é reusável somente porque sua interface não
combina com a interface específica de um
domínio que uma aplicação requer
• Exemplo: um editor de desenho
– Abstração chave: Shape
• Subclasses:
– LineShape,
– PolygonShape
– TextShape --> mais complicado (atualização de tela, gerência de buffer)
3 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
4. Motivação
• Ideal: usar TextView toolkit de prateleira
– Mas as interfaces podem não “casar”
– Opções:
1) Mudar código de TextView (não faz sentido, além
de se precisar do código fonte do mesmo)
2) Definir TextShape para que ele adapte a interface
de TextView para a de Shape
• Existem duas formas de se fazer isto...
4 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
5. Motivação
• Duas formas:
– Versão Adaptador de Classe: herdando a
interface de Shape e a implementação de
TextView
– Versão Adaptador de Objeto: compondo uma
instância de TextView dentro de TextShape e
implementando TextShape em termos da
interface de TextView
5 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
6. Versão Adaptador de Objeto
6 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
7. Aplicação
• Use o padrão Adaptador quando:
– Deseja-se usar uma classe pré-existente e sua interface
não combina (“casa”) com a que você precisa
– Deseja-se criar uma classe reusável que coopere com
classes não relacionadas ou imprevisíveis, isto é, classe
que não necessariamente tenham interfaces compatíveis
– Precisa-se usar várias subclasses pré-existentens, mas e
impraticável adaptar suas interfaces através de subclasse
de todos. Um adaptador de objetos pode adaptar a interface
da classe pai (somente no caso de adaptador de objeto)
7 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
8. Estrutura (Adaptador de Classe)
8 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
9. Estrutura (Adaptador de Objeto)
9 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
10. Participantes
• Target (Shape)
– Define uma interface específica de domínio que o Cliente
usa
• Client (DrawingEditor)
– Colabora com objetos de acordo com a interface de Target
• Adaptee (TextView)
– Define uma interface pré-existente que necessita de
adaptação
• Adapter (TextShape)
– Adapta a interface de Adaptee para a de Target
10 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
11. Colaborações
• Clientes chamam operações de uma
instância do Adaptador (Adapter)
• Por sua vez, o adaptador chama operações
de Adaptee que atendem à requisição
11 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
12. Conseqüências
• Um adaptador de classe:
– Adapta Adaptee para Target pelo “contrato” com a
classe concreta Adapter. Como conseqüência, uma
classe adapter não funcionará quando se deseja
adaptar uma classe e todas suas subclasses
– Permite Adapter sobrescrever algum comportamento
de Adaptee, uma vez que Adapter é uma subclasse de
Adaptee
– Introduz somente um objeto e nenhuma indireção de
ponteiro adicional é necessária para se obter o
“adaptado” Livro Texto: Design Pattern - Elements
12 Eduardo N. F. Zagari
of Reusable OO Software - Gamma
13. Conseqüências
• Um adaptador de objeto:
– Permite que um único Adapter trabalhe com muitos
Adaptees, isto é, o próprio Adaptee e todas as suas
subclasses (se alguma). O Adapter também pode
adicionar funcionalidade a todos os Adaptees de uma
única vez.
– Torna mais difícil sobrescrever o comportamento do
Adaptee. Isto irá requerer além das subclasses de
Adaptee que se faça que o Adapter se refira a elas ao
invés do próprio Adaptee
13 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
14. Conseqüências
• Quanto de trabalho os Adaptadores fazem?
– Isto varia desde a simples conversão das interfaces
(de Adaptee para Target) até o suporte a um conjunto
inteiramente diferente de operações
• Adaptadores plugáveis
– Uma classe é mais reusável quando se minimizam as
considerações que outras classes devem fazer para
usá-la. Como? Fazendo a adaptação de interface
dentro da classe (ver exemplo!)
14 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
15. Implementação
• Embora a implementação do Adaptador
geralmente seja direta, algumas questões
para se manter em mente:
– Em C++, a implementação de um adaptador
de classe deveria herdar publicamente de
Target e de modo privado de Adaptee. Assim,
o Adapter seria um subtipo de Target, mas não
de Adaptee
15 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
16. Implementação
• Adaptadores plugáveis:
– Considere o componente TreeDisplay que pode mostrar
estruturas de árvores graficamente.
• Se queremos que ele seja “mais reusável”, não se pode
querer que os objetos que ele mostre tenham uma interface
específica
• Aplicações definem suas próprias estruturas de árvores e
cada estrutura terá sua própria interface...
– Primeiro passo: encontrar uma interface minimalista (narrow
interface) para o Adaptee, isto é, o conjunto mínimo de operações
que nos permitam realizar a adaptação
16 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
17. Implementação
• No caso do TreeDisplay, a interface minimalista deve incluir 2
operações:
– Uma que define como apresentar um nó em uma estrutura
hierárquica graficamente
– Outra que recupere o nó filho
• 3 abordagens para Interface Narrow:
– Usando operações abstratas
– Usando objetos delegados
– Usando adaptadores parametrizados (Smaltalk)
17 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
18. Operações Abstratas
18 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
19. Objetos Delegados
19 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
20. Exemplo
20 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
21. Exemplo
• Shape considera BoundingBox pelos cantos.
• TextView define pela origem, altura e largura
• Shape tem a operação CreateManipulator
• TextView não tem operação equivalente
• TextShape é um adaptador entre estas interfaces
diferentes
21 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
22. Exemplo
• Um adaptador de classes usa herança
múltipla para adaptar interfaces.
– A chave é usar um “ramo” da herança para
herdar a interface e outra para herdar a
implementação (em C++ a primeira de forma
pública e a outra privada)
22 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
23. Exemplo (adaptador de classe)
23 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
24. Exemplo
24 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
25. Exemplo
25 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
26. Exemplo (adaptador de objeto)
26 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
27. Exemplo
27 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma