padrão de projeto adapter

38
Padrão de Projeto Adapter

Upload: matheus-andrade

Post on 09-Jul-2015

8.389 views

Category:

Technology


0 download

DESCRIPTION

Simples apresentação sobre o Padrão de Projeto ADAPTER

TRANSCRIPT

Page 1: Padrão De Projeto Adapter

Padrão de ProjetoAdapter

Page 2: Padrão De Projeto Adapter

Uma tomada que só aceita plugue de 2 pinos

Page 3: Padrão De Projeto Adapter

Plugue com 3 pinos de um dispositivo

Page 4: Padrão De Projeto Adapter

Como Conectá-los?

Page 5: Padrão De Projeto Adapter

Utilizando um Adaptador

Page 6: Padrão De Projeto Adapter

Porém

O plugue e a tomada possuem interfaces diferentes entre si, portanto eles não podem se encaixar.

Perceba que

Utilizando um ADAPTADOR, um instrumento que transforma uma interface em outra, a conexão foi realizada.

Page 7: Padrão De Projeto Adapter
Page 8: Padrão De Projeto Adapter

Por que não troquei a tomada?

Por que não troquei o plugue do dispositivo?

Page 9: Padrão De Projeto Adapter

Em Projetos de Desenvolvimento de Software também encontramos

problemas como este!

Page 10: Padrão De Projeto Adapter

Um exemplo

  

Suponha que em um projeto, utilizamos uma classe utilitária de um framework (ou o próprio completo) ou de uma

biblioteca de classes de terceiros.

Em todo o nosso projeto, utilizamos os métodos desta classe.

Page 11: Padrão De Projeto Adapter

Classe  de uma biblioteca de terceiros utilizada no projeto

class ClasseUtil        def hello            "Hello"        end

        def world            "World"        endend

Page 12: Padrão De Projeto Adapter

Na documentação da classe, o método hello será depreciado (sem utilização) no futuro.

   

Digamos que versões subseqüentes da classe sejam lançadas e o método hello tenha sido retirado definitivamente. 

 

Page 13: Padrão De Projeto Adapter

Como poderemos utilizar a nova versão da classe em nossa aplicação que utiliza o antigo método hello (agora

excluído)?  

Se apenas substituírmos a classe em nossa aplicação, será disparado um erro, afirmando que está sendo feito uma

chamada que não existe. E agora?

Page 14: Padrão De Projeto Adapter

ADAPTER(Também conhecido como: Wrapper ou Translator)

Page 15: Padrão De Projeto Adapter

Propósito

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. Às vezes é preciso modificar uma

classe que não pode ser alterada adequadamente devido à falta do código fonte (alguma biblioteca de classes

comercial), ou por alguma outra razão. O Adapter é uma das formas de modificar classes nestas circunstâncias, sendo

classificado com a de finalidade estrutural e abrange tanto escopo de classe quanto de objeto.

Page 16: Padrão De Projeto Adapter

Motivação:

Adapter é usado quando:

Uma classe já existente e sua interface não combinam com a esperada pelo cliente; Se quer criar uma classe reutilizável que coopera com classes não relacionadas ou não previstas, isto é, classes que não necessariamente tenham interfaces compatíveis; Se necessita usar várias subclasses existentes, mas é impraticável adaptar suas interfaces fazendo um Subclassing de cada uma.

Page 17: Padrão De Projeto Adapter

Formas de Implementação

Object Adapter Cria-se uma classe intermediária que servirá como interface entre as chamadas do código do cliente e  o código alvo.

 Class Adapter

 Cria-se uma classe que herdará da classe do cliente e sobrescreve-se ou recria-se o método chamado.

Page 18: Padrão De Projeto Adapter

Componentes

 Adaptado: Classe que contém a funcionalidade que o cliente está interessado. Entretanto não é compatível com o cliente.

 Alvo: Domínio da interface específica que o cliente usa.

 Adaptador: Classe que adapta o Alvo ao Adaptado.

 Cliente: Interage com o Adaptado incompatível.

Page 19: Padrão De Projeto Adapter

Object AdapterObjects usam uma técnica composta para adaptar uma interface à outra. O Adapter herda a interface-alvo que o client eespera ver. Quando o cliente chama um método no objeto alvo, o pedido é traduzido para o método correspondente no adaptado.ObjectAdapters permitem que o cliente e o adaptado sejam transparentes um para o outro. Só o Adapter sabe da existencia dos dois. Sua principal vantagem é que o Adapter adapta não somente o Adaptado mas todas as suas subclasses. A principal desvantagem é que  seu uso requer a escrita de todo o código necessario para delegar as chamadas do Adaptado.

Page 20: Padrão De Projeto Adapter

Diagrama de um Object Adapter

 

Page 21: Padrão De Projeto Adapter

Class Adapter

Class Adapters usam herança invés de composição. Isso significa que invés de elegaras chamadas ao Adaptado, ela as põe em sub-classes. Assim, Class Adapters devem herdar tanto o Alvo quanto o Adaptado. Ao fazer uma chamada ao Alvo, a chamada é simplesmente encaminhada para o método especifico que foi herdado pela interface

     

Page 22: Padrão De Projeto Adapter

Diagrama de um Class Adapter

 

Page 23: Padrão De Projeto Adapter

Object Adapters X Class AdaptersO OA permite que um único Adapter trabalhe com muitos Adaptados (e suas sub-classes), já o CA adapta uma classe concreta e não suas sub-classes.O CA pode sobrepor alguns comportamentos do Adaptado visto que é uma subclasses dele, o que não é tão trivial no OA. A implementação do CA normalmente é mais simples pois envolve menos código.

Page 24: Padrão De Projeto Adapter

Aplicabilidade

Use o Padrão Adapter quando:  

Desejar usar uma classe existente e sua interface não corresponde ao que você precisa; Desejar criar uma classe reutilizável que coopera com classes imprevistas ou não relacionáveis, isto é, classes que não tem necessariamente interfaces compatíveis.

Page 25: Padrão De Projeto Adapter

Estrutura

Page 26: Padrão De Projeto Adapter

Voltando ao Código...

Page 27: Padrão De Projeto Adapter

A Nova Classe da Biblioteca class ClasseUtil        #def hello ----------> Método depreciado    #    "Hello"    #end         def alo        "Hello"    end

    def world        "World"    endend

Page 28: Padrão De Projeto Adapter

Adaptador (Composição)class AdapterC    @biblioteca

    def initialize        self.biblioteca = ClasseUtil.new #instanciando a biblioteca    end

    def hello        self.biblioteca.alo    end

    def world        self.biblioteca.world    endend

Page 29: Padrão De Projeto Adapter

Adaptador (Herança)class AdapterH < ClasseUtil

    def initialize    end

    def hello        self.alo #readaptando a chamada para o metodo correto    end

    end

Page 30: Padrão De Projeto Adapter

ACTIVE RECORDS

Aplicação Clássica do Adapter no RoR

Page 31: Padrão De Projeto Adapter

Mysql, Postgres, Oracle, SqlServer...

  results = mysql_connection.query(sql)

ou

results = sybase_connection.sql(sql)

e por aí vai...

Page 32: Padrão De Projeto Adapter

Active Record soluciona com AbstractAdapter

define a interface para um banco de dados que é usado em todo o Active Record

 Subclasses da AbstractAdapter: MysqlAdapter, SybaseAdapter, OracleAdapter, etc.

 Cada subclasse implementa seus métodos

Page 33: Padrão De Projeto Adapter

Adaptar ou Modificar?

Page 34: Padrão De Projeto Adapter

Procure modificar as classes quando:

 as alterações forem simples e claras;você entende completamente o código contido na classe;a modificação será "definitiva" para o projeto

LEMBRETE: O Ruby suporta modificar o objeto em tempo

de execução

Page 35: Padrão De Projeto Adapter

Adote a solução de adaptadores quando:

a incompatibilidade entre as interfaces é grande e complexa ;você não tem bastante conhecimento e afinidade com o código e a idéia contida na classe 

Page 36: Padrão De Projeto Adapter

Por que não troquei a tomada?

Por que não troquei o plugue do dispositivo?

Page 37: Padrão De Projeto Adapter

Padrões RelacionadosO Adapter se relaciona a outro padrões pela semelhança entre a implementação.

Proxy: Enquanto o Adapter visa traduzir interfaces entre cliente e objeto final, o Proxy visa poder interferir entre a chama do Cliente e a execucao do objeto final.Decorator: Agrega funcionalidades a outros objetos sem alterar sua interface. Por isso esse padrão é mais transparente à aplicação que uma Adapter. Como sua interface se mantém, o Decorator suporta composição recursiva, algo que nao se aplica ao Adapter. Bidge: Tem uma estrutura similiar ao Adapter, mas o proposito de separar a interface da implementação.

Page 38: Padrão De Projeto Adapter

FIM

Lorena Erdens Matheus Andrade