Download - Padrões-11 - Padrões Estruturais - Adaptador
Padrões de Projeto
Padrões Estruturais
Adaptador
2 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
3 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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)
4 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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...
5 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Versão Adaptador de Objeto
7 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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)
8 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura (Adaptador de Classe)
9 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura (Adaptador de Objeto)
10 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
11 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
12 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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”
13 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
14 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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!)
15 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
16 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
17 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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)
18 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Operações Abstratas
19 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Objetos Delegados
20 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
21 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
22 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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)
23 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo (adaptador de classe)
24 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
25 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
26 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo (adaptador de objeto)
27 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo