terça-feira, 9 de novembro de 2010

Adapter Pattern


Adapter Pattern
Também conhecido como Wrapper.

Definição

O Adapter pattern é usado para traduzir a interface de uma classe em outra interface. Isso significa que nós podemos fazer classes trabalharem juntas, do
contrário, não poderiam por causa de interfaces incompatíveis. Um adaptador de classe usa herança múltipla (estendendo uma classe e / ou implementação de uma ou mais  classes) para adaptar uma interface para outra. Um adaptador de objeto depende do objeto de agregação.

Quando usar

• Quando você quiser usar uma classe existente e sua interface não corresponde ao que você precisa.
• Quando você quiser criar uma classe reutilizável que coopera com independentes ou classes imprevistas, isto é, classes que não têm necessariamente interfaces compatíveis.
• Quando você quiser aumentar a transparência das classes.
• Quando você quer fazer um kit pluggable.

Benefícios

• Classes altamente reutilizáveis.
• Apresenta apenas um objeto.


Desvantagens / consequências

Ao utilizar Java, Target deve ser uma interface.

Exemplo

Imagine que você precisa desenvolver um gerenciador de arquivos simples para lidar com documentos de texto. Existe um recurso que já lida com isso, mas por alguma razão, você é forçado a uma interface específica para o seu gerenciador de arquivos. Por estar usando um adaptador de classe, podemos usar a interface de uma maneira forçada e ainda reutilizar as funcionalidades existentes. No diagrama de classe abaixo o alvo da interface é FileManager
(interface desejada). FileManagerUtil é a classe de utilitário existente que
nós gostaríamos de se adaptar a interface FileManager. Nós fazemos a adaptação real na classe FileManagerImpl, essa classe usa a interface desejada e a funcionalidade existente por meio de herança, ou seja, um adaptador de classe.
 
public interface FileManager {
public String open(String s);
public String close();
public String read(int pos, int amount, byte[] data);
public String write(int pos, int amount, byte[] data);
}

import java.util.*;
import java.io.*;
public class FileManagerUtil {
private RandomAccessFile f;
public boolean openFile(String fileName) {
System.out.println( "Opening file: " + fileName);
boolean success = true;
return success;
}

public boolean closeFile() {
System.out.println( "Closing file" );
boolean success = true;
return success;
}




public boolean writeToFile(String d, long pos, long amount) {
System.out.print( "Writing " + amount + " chars from string: " + d);
System.out.println(" to pos: " + pos + " in file" );
boolean success = true;
return success;
}

public String readFromFile(long pos, long amount) {
System.out.print(
"Reading " + amount + " chars from pos: " + pos + " in file");
return new String("dynamite");
}
}

public class FileManagerImpl extends FileManagerUtil implements FileManager{

public String close() {
return new Boolean(closeFile()).toString();
}

public String open(String s) {
return new Boolean(openFile(s)).toString();
}

public String read(int pos, int amount, byte[] data) {
return readFromFile(pos, amount);
}

public String write(int pos, int amount, byte[] data) {
boolean tmp= writeToFile(new String(data), pos, amount);
return String.valueOf(tmp);
}
}

public class FileManagerClient {
public static void main(String[] args) {
FileManager f = null;
String dummyData = "dynamite";
f = new FileManagerImpl();

System.out.println("Using filemanager: " + f.getClass().toString());
f.open("dummyfile.dat");
f.write(0, dummyData.length(), dummyData.getBytes());
String test =
f.read(0, dummyData.length(), dummyData.getBytes());
System.out.println("Data written and read: "+test);
f.close();
}
}

Quando FileManagerClient é executado o resultado é:
Abrindo o arquivo: dummyfile.dat
Escrevendo 8 caracteres de string: dinamite para pós: 0 no arquivo
Leitura 8 caracteres de pos: 0 em fileData escrito e lido: dinamite
A fechar o ficheiro

Exemplo de uso
A API Java usa o padrão Adapter, WindowAdapter, ComponentAdapter,
ContainerAdapter, KeyAdapter FocusAdapter, MouseAdapter,
MouseMotionAdapter.



Nenhum comentário:

Postar um comentário