Beruflich Dokumente
Kultur Dokumente
Agenda
Definio
Exemplos
Problema
Soluo
Injeo de dependncia
Injeo por construtor
Injeo por mtodo
Injeo por parmetro
Service Locator
Definio
Precisamos separar quem controla as dependncias e quem as usa.
Queremos diminuir o acoplamento de uma classe
Diminuir o acoplamento: s usar e depender de interfaces.
Disando diminuir a manuteno da classe
quando as classes externas mudarem
Obs: Tambm chamado de Inverso de Controle
entretanto inverso de controle do incio dos frameworks grficos.
Exemplo
public class VendaDeProduto {
public void vendeProduto(Produto produto) {
//Todo o cdigo para a venda do produto...
Log log = new Log("Arquivo.txt");
log.grava(produto);
}
}
Problema
Cada classes que faz uso de log
precisa ser aberta para mudar o arquivo de log.
Usar ou mudar o log no deveria ser um motivo de manuteno (SRp)
E se houverem 100 classes que fazem log?
Como faramos para testar esta classe?
Soluo
Inverter a dependncia.
A classe deve somente usar a dependncia (abstrao)
Vamos injetar a dependncia
Injeo de dependncia
Por construtor
Por mtodo
Por parmetro
Injeo por construtor
O objeto precisa da dependncia para existir
public class VendaDeProduto {
private Log log;
public void VendaDeProduto(Log logVenda) {
this.log = logVenda;
}
public void vendeProduto(Produto produto) {
//Todo o cdigo para a venda do produto...
log.grava(produto);
}
}
Injeo por mtodo
O objeto tem uma dependncia opcional (pode precisar ou no)
public class VendaDeProduto {
private Log log;
public void setLog(Log logVenda) {
this.log = logVenda;
}
public void vendeProduto(Produto produto) { }
public void vendeProdutoComLog(Produto produto) { log.grava(produto); }
}
Injeo por parmetro
Somente ser necessria a dependncia quando o servio for solicitado
public class VendaDeProduto {
public void vendeProduto(Produto produto, Log logVenda) {
log.grava(produto);
}
}
Service Locator
public class Registro()
private Log log;
pubic Registro() {
log = new Log(arquivo);
}
pubic Log getLog() {
return log;
}
}
Referncias
http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm