DependencyInversionPrincipleGuilherme PereiraTúlio Guimarães
Classes de baixo nível que realizam operações básicas.Classes de alto nível com a lógica complexa.Dependência entre as duas classes.Rigidez, fragilidade e imobilidade.Introduzir uma camada de abstração entre as duas classes.
Princípio: módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações
abstrações não devem depender de detalhes. Os detalhes é que devem depender das abstraçõesDois padrões de projeto ajudam a implementar este princípio: TemplateMethod
StragetyMethod. Estes dois padrões escondem as especificidades de um algoritmo tanto via herança (Template) ou delegação via uma interface (Strategy)
Antes:
publicclass Trabalhador {privateBooleantemValeTransporte;privateBooleantemValeRefeicao;privatedoublesalarioBase;}publicclassValeRefeicao {privatedoublevr = 12;publicdoubleretornarValorValeRefeicao(intdiasNoMes){returndiasNoMes * vr;    }}
publicclassCalculadoraSalario {    Trabalhador trabalhador;privateintdiasUteisMes;publicvoidCalculadoraSalario(int dias, Trabalhador trab) {        trabalhador = trab;diasUteisMes = dias;    }publicdoubleretornarSalarioBase(){return trabalhador.getSalarioBase();    }publicdoubleretornarSomaBeneficios(){double total = 0;if(trabalhador.getTemValeRefeicao())        {            total += newValeRefeicao().retornarValorValeRefeicao(diasUteisMes);        }if(trabalhador.getTemValeTransporte())        {            total += newValeTransporte().retornarValorValeTransporte(diasUteisMes);        }return total;    }
Depois:
public interface IBeneficios {doubleretornarValorBeneficio(intdiasNoMes);}publicclassValeRefeicaoimplementsIBeneficios {privatedoublevr = 12;publicdoubleretornarValorBeneficio(intdiasNoMes){returndiasNoMes * vr;    }}
publicclass Trabalhador {privatedoublesalarioBase;privateList<IBeneficios> listaDeBeneficios;public Trabalhador(){listaDeBeneficios = newLinkedList<IBeneficios>();    }publicList<IBeneficios> getListaDeBeneficios() {returnlistaDeBeneficios;    }publicvoidsetListaDeBeneficios(List<IBeneficios> listaDeBeneficios) {this.listaDeBeneficios = listaDeBeneficios;    }}

Dip the dependency inversion principle