Série DesignPattern: Adapter

Olá Pessoal,
Mais um post da série “Design Pattern não é receita de bolo”. Hoje vamos conhecer o padrão Adapter. Pelo nome já temos ideia do que seria o padrão. Mas como seria à nível de código Java? Boa pergunta. Vamos ver isso no nosso post de hoje. Ah, o Adapter faz parte da família ‘Padrões Estruturais’.

Lets go…

Adapter

Substitui um objeto por outro que realiza a mesma tarefa, mas por uma interface diferente (não estamos  falando de interface Java aqui).

Exemplo:
As novas tomadas brasileiras realizam a mesma tarefa que as antigas, mas por uma interface diferente (com três pinos). Esse novo pino é uma nova funcionalidade.

Motivação
A motivação é querer adicionar uma nova funcionalidade ao sistema sem perder o comportamento e com custo baixo.No caso da tomada, o custo da mudança é comprar apenas um adaptador (adapter). Já pensou se além do adaptador tivéssemos que trocar o tipo do fio (somente para seguir o novo padrão)? Isso seria inviável e o custo muito alto. Um adaptador não pode gerar um custo alto para o novo modelo. Em aplicação, podemos pensar da seguinte forma: “adicionar aquele novo componente ao legado não pode custar caro demais e sim ter o custo considerável, como colocar mais memoria no servidor ou HD, mas não pode exigir um novo tipo de servidor de 1 milhão de dólares, por exemplo”. Quando estiver com dúvida com o Adapter, pergunte-se por que você tem adaptadores em sua casa? O motivo é que você não vai trocar toda sua instalação elétrica para o novo modelo.

Prática
A seguir temos uma prova de conceito da implementação do Adapter. Usei as novas tomadas brasileiras como exemplo. Novamente procure entender o uso do Adapter e como implementar. O código não tem nenhuma funcionalidade legal de ver, apenas um println com uma mensagem. O foco é conhecer o Design Pattern Adapter. A seguir uma modelagem bem didática, para facilitar o entendimento:

Passo 1
Como sempre, o nosso projeto:

Agora criamos a classe Tomada (ela possui a implementação antiga).

package br.com.camilolopes.classes;
/*
* tomada antiga
* ela não tem controle de energia como as novas
*/
public class Tomada {

public void on(){
System.out.println(“tomada conectada”);
}
public void off(){
System.out.println(“tomada desconectada”);
}
}

Passo 2
Obviamente que adapters são criados em classes já existentes. Então o primeiro ponto é ver onde precisa de um adaptador. No caso acima, precisamos de um adaptador nas tomadas. Para isso vamos extend a classe ‘Tomada’ já existente, assim fazemos tudo que ela já fez e não quebramos nada:

package br.com.camilolopes.adapters;

import br.com.camilolopes.classes.Tomada;
import br.com.camilolopes.newmodel.TomadaNova;
/*
* criando o adaptador
* ele que tem a responsabilidade de chamar o método novo
*/
public class TomadaAdapter extends Tomada {
private TomadaNova tomadaNova;

public TomadaAdapter() {
tomadaNova = new TomadaNova();
}

@Override
public void on() {
tomadaNova.on(true);
}

@Override
public void off() {
tomadaNova.off(false);
}

}

Acabamos de criar nosso Adapter.

E agora vamos criar a classe que tem a implementação das novas Tomadas.

TomadaNova.java

package br.com.camilolopes.newmodel;
/*
* aqui é a implementação do novo modelo de tomada
*/
public class TomadaNova {
public void on(boolean status){
System.out.println(“Novas tomadas Brs”);
checkEnergia(status);
}

private void checkEnergia(boolean status) {
if (status) {
System.out.println(“controle de segurança de energia está ” + status);
}else{
System.out.println(“controle de segurança de energia está ” + status);
}

}

public void off(boolean status) {
checkEnergia(status);

}
}

A classe Adapter é responsável por estar conectada à antiga tomada e com a nova. O usuário vai conectar ao Adapter e ele terá que chamar a nova implementação de tomada que, no nosso caso, eu disse que nas novas tomadas, há um sistema de controle de energia, por medida de segurança.

Criaremos a classe com o método main que será o ponto de entrada para receber a tomada e conectar ao adapter. Veja:

package br.com.camilolopes.main;

import br.com.camilolopes.adapters.TomadaAdapter;
import br.com.camilolopes.classes.Tomada;

public class TesteNovaTomada {

/**
* @param args
*/
public static void main(String[] args) {
/*
* conectando a tomada ao adaptador – adapter
*/
Tomada tomada = new TomadaAdapter();
//ligando a tomada
tomada.on();
//desligando a tomada
tomada.off();

}

}

O Resultado
Pronto! Veja que nosso Adapter já usa a versão da tomada.

 

Git Hub 

Os projetos encontram-se no Github:

https://camilolopes@github.com/camilolopes/workspacedesignpattern.git 

Bom, é isso ai pessoal. Vou ficando por aqui. Espero que vocês estejam curtindo a série.
Abraços, see ya!!