Resumidamente o padrão Adapter permite que duas interfaces incompatíveis, mas com funcionalidades semelhantes, trabalhem juntas.
O padrão Adapter é fácil de entender porque o mundo real está repleto de dele!
Exemplo
Suponha que você tenha uma ChaveA que abre uma FechaduraA. Conceitualmente a fechadura é a interface que exige uma determinada chave para que a porta seja aberta:
public class ChaveA {
    //atributos e métodos
}
public interface FechaduraA {
    void open(ChaveA chaveA);
}
public class FechaduraAImpl implements FechaduraA{
    @Override
    public void open(ChaveA chaveA) {
        System.out.println("Fechadura A aberta!");
    }   
}
E a classe cliente que contém o método main():public class Cliente {
    public static void main(String[] args) {
        FechaduraA fechaduraA = new FechaduraAImpl();
        ChaveA chaveA = new ChaveA();
        open(fechaduraA, chaveA);
    }
    //requer como parâmetro uma FechaduraA e uma ChaveA para abrir
    static void abrir(FechaduraA fechaduraA, ChaveA chaveA){
        fechaduraA.open(chaveA);
    }   
}
Chamando o método main() na classe Cliente conseguimos abrir a fechadura sem problema. A saída é como segue:Fechadura A aberta!O método estático abrir() na classe Cliente exige dois argumentos, um objeto Fechadura e outro objeto do tipo Chave para então invocar o método open() da fechadura.
Imagine que apareça no mercado um novo padrão de fechaduras, o qual requeira também um novo tipo de chave.
public interface NovoPadraoFechaduraA {
    void open(ChaveB chaveB);
}
public class ChaveB {
    //código da classe B
}
E uma implementação concreta da interface NovoPadrãoFechaduraA:public class NovoPadraoFechaduraAImpl implements NovoPadraoFechaduraA{
    @Override
    public void open(ChaveB chaveB) {
        System.out.println("Novo Padrão Fechadura A aberta!");
    }   
}
Seu sistema precisa implementar esse novo padrão, porém outras partes da aplicação continurão a usar o modelo antigo. Assim surge a questão: como atender a nova demanda sem prejudicar as outras partes que utilizam o padrão antigo? Em outras palavras, você precisa implementar o novo padrão, mas não poderá modificar o método estático abrir() da classe Cliente, o qual exige os modelos antigos de fechadura e chave!
O padrão Adapter resolve de forma eficiente essa questão. Ele torna possível utilizar as novas interfaces sem alterar o método abrir(). Para isso apenas precisamos criar uma classe que implemente a interface FechaduraA e também utilize as funcionalidades da interface da interface NovoPadraoFechaduraA. Chamemos esta classe de ChaveAAdaptador:
Código da classe Adapter:
public class ChaveAAdaptador implements FechaduraA{
    NovoPadraoFechaduraA novoPadrao;
    ChaveB chaveB;
    public ChaveAAdaptador(NovoPadraoFechaduraA fechadura) {       
        this.novoPadrao = fechadura;
        this.chaveB = new ChaveB();
    }   
    @Override
    public void open(ChaveA chaveA) {
        this.novoPadrao.open(chaveB);       
    }       
}
Instanciamos o adaptador na classe Cliente e podemos usar o novo padrão sem alterar o método abrir():public class Cliente {
 
    public static void main(String[] args) {
        //modelo antigo
        FechaduraA fechaduraA = new FechaduraAImpl();
        ChaveA chaveA = new ChaveA();
        abrir(fechaduraA, chaveA);     
        //novo padrão
        NovoPadraoFechaduraA novoPadraoFechaduraA = new NovoPadraoFechaduraAImpl();
        ChaveAAdaptador adaptador = new ChaveAAdaptador(novoPadraoFechaduraA);
        abrir(adaptador, chaveA);
    }
  
    static void abrir(FechaduraA fechaduraA, ChaveA chaveA){
        fechaduraA.open(chaveA);
    }   
}
saídaFechadura A aberta! Novo Padrão Fechadura A aberta!



 
No comments:
Post a Comment