Sie sind auf Seite 1von 12

Inverso de Dependncia

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

Das könnte Ihnen auch gefallen