douglaskd:
é bem complexo…
mais vc precisa se ater a teoria
imagine por exemplo, que algumas classes com alguns métodos criadas por outros programadores. ex (List getFuncionarios() )
então você começa a desenvolver um sistema, a parte onde mostra os resultados na tela…
vamos supor que há uma outra classe encapsulada que mostra esses resultados…ex: ListarFuncionarios()
você esta lá desenvolvendo o sistema, por questões de performance vai ser necessário enviar/receber tipos váriados de listas, se você for converter essas listas para um formato especifico vai piorar ainda mais.
usando as interfaces, você envia um tipo “genérico” de dados e recebe um tipo “genérico” de dados…, mais deve-se usar com cautela =)
outro exemplo: vamos dizer que eu quero criar uma classe PDF e um método gerarPDF();
dentro desse método ele tem que diferenciar se é DOC, XSL, HTML etc…
eu quero usar o método assim gerarPDF (arquivoASerGerado), e não assim gerarPDF(ArquivoASerGerado, DOC)…Interfaces…
Resumindo Grotescamente: "Você tem que deixar seus método mais reutilizaveis, sem que precisem serem alterados, e que sejam mais faceis de serem usados na hora de mostrar na tela, reduzindo aclopamento…se você mudar o tipo de retorno la na tela, seu código continua funcionando, porque o método se “adapta”.
também gostaria de saber se eu estou totalmente certo sobre o que disse acima…
Em vários sistemas que já fiz, tive a necessidade de criar conversores de dados. Então, criei uma interface:
public interface Transformer {
public <T> T from (String source) throws TransformerException;
public <T> String to(T source) throws TransformerException;
}
E as implementações:
public class JSONTransformer implements Transformer {
// métodos...
}
public class XMLTransformer implements Transformer {
// métodos...
}
Cada vez que vou usar uma dessas interfaces, eu referencio somente o transformer:
public class Service {
private Transformer transformer;
public Service(Transformer transformer) {
this.transformer = transformer;
}
public void doSomething() throws TransformerException{
MyObject myObject = new MyObject();
String myObjectAsString = transformer.to(myObject);
MyObject newMyObject = transformer.from(myObjectAsString);
}
}
Ou seja… na classe Service, a qualquer momento eu posso mudar a transformação de dados de XML para String, sem precisar alterar uma única linha de código (isso porque, além de tudo, eu usei injeção de dependências - no caso, a dependência é o transformer).
Isso cria uma flexibilidade incrível, porque, se eu precisar modificar o tipo de dado gerado, eu só preciso injetar um transformador compatível com o novo tipo de dado. Por exemplo, se eu quiser criar um CSV, basta criar uma classe que implemente Transformer e injetar essa classe na minha classe Service.
[]'s