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