Padrões-11 - Padrões Estruturais - Adaptador

Post on 17-Dec-2014

2.498 views 4 download

description

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

Transcript of 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