padrões-11 - padrões estruturais - adaptador

27
Padrões de Projeto Padrões Estruturais Adaptador

Upload: nicola-zagari

Post on 17-Dec-2014

2.498 views

Category:

Technology


4 download

DESCRIPTION

Padrões de Projeto. Padrão Estrutural. Adaptador.

TRANSCRIPT

Page 1: Padrões-11 - Padrões Estruturais - Adaptador

Padrões de Projeto

Padrões Estruturais

Adaptador

Page 2: Padrões-11 - 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

Page 3: Padrões-11 - Padrões Estruturais - Adaptador

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)

Page 4: Padrões-11 - Padrões Estruturais - Adaptador

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...

Page 5: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 6: Padrões-11 - Padrões Estruturais - Adaptador

6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Versão Adaptador de Objeto

Page 7: Padrões-11 - Padrões Estruturais - Adaptador

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)

Page 8: Padrões-11 - Padrões Estruturais - Adaptador

8 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Estrutura (Adaptador de Classe)

Page 9: Padrões-11 - Padrões Estruturais - Adaptador

9 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Estrutura (Adaptador de Objeto)

Page 10: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 11: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 12: Padrões-11 - Padrões Estruturais - Adaptador

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”

Page 13: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 14: Padrões-11 - Padrões Estruturais - Adaptador

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!)

Page 15: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 16: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 17: Padrões-11 - Padrões Estruturais - Adaptador

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)

Page 18: Padrões-11 - Padrões Estruturais - Adaptador

18 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Operações Abstratas

Page 19: Padrões-11 - Padrões Estruturais - Adaptador

19 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Objetos Delegados

Page 20: Padrões-11 - Padrões Estruturais - Adaptador

20 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 21: Padrões-11 - Padrões Estruturais - Adaptador

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

Page 22: Padrões-11 - Padrões Estruturais - Adaptador

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)

Page 23: Padrões-11 - Padrões Estruturais - Adaptador

23 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo (adaptador de classe)

Page 24: Padrões-11 - Padrões Estruturais - Adaptador

24 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 25: Padrões-11 - Padrões Estruturais - Adaptador

25 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 26: Padrões-11 - Padrões Estruturais - Adaptador

26 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo (adaptador de objeto)

Page 27: Padrões-11 - Padrões Estruturais - Adaptador

27 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo