padrão de projeto adapter

Post on 09-Jul-2015

8.389 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Padrão de ProjetoAdapter

Uma tomada que só aceita plugue de 2 pinos

Plugue com 3 pinos de um dispositivo

Como Conectá-los?

Utilizando um Adaptador

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.

Por que não troquei a tomada?

Por que não troquei o plugue do dispositivo?

Em Projetos de Desenvolvimento de Software também encontramos

problemas como este!

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.

Classe  de uma biblioteca de terceiros utilizada no projeto

class ClasseUtil        def hello            "Hello"        end

        def world            "World"        endend

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. 

 

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?

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

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.

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.

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.

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.

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.

Diagrama de um Object 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

     

Diagrama de um Class 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.

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.

Estrutura

Voltando ao Código...

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

    def world        "World"    endend

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

Adaptador (Herança)class AdapterH < ClasseUtil

    def initialize    end

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

    end

ACTIVE RECORDS

Aplicação Clássica do Adapter no RoR

Mysql, Postgres, Oracle, SqlServer...

  results = mysql_connection.query(sql)

ou

results = sybase_connection.sql(sql)

e por aí vai...

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

Adaptar ou Modificar?

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

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 

Por que não troquei a tomada?

Por que não troquei o plugue do dispositivo?

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.

FIM

Lorena Erdens Matheus Andrade

top related