definição:
Os módulos de alto nível não devem depender de módulos de baixo nível, ambos devem depender de sua abstração; As abstrações não devem depender de detalhes; Os detalhes devem depender da abstração.
A origem do problema: Classe A depende diretamente da classe B. Se você deseja alterar a Classe A para depender da Classe C, você deve alcançá-lo modificando o código da classe A. nesse cenário, a classe A geralmente é um módulo de alto nível responsável pela lógica de negócios complexa; Classe B e Classe C são módulos de baixo nível responsáveis pelas operações atômicas básicas; Se a classe A for modificada, trará riscos desnecessários para o programa.
Solução: Modifique a classe A para depender da interface I e da classe B e da classe C cada interface I. Classe A indiretamente entra em contato
O princípio da inversão de dependência é baseado no fato de que as coisas abstratas são muito mais estáveis do que a variabilidade nos detalhes. A arquitetura construída sobre resumo é muito mais estável do que a arquitetura construída sobre detalhes. Em Java, resumo refere -se a uma interface ou classe abstrata, e os detalhes são classes de implementação específicas. O objetivo do uso da interface ou da classe abstrata é formular especificações e contratos sem envolver quaisquer operações específicas e entregar a tarefa de apresentar detalhes às suas classes de implementação para conclusão.
A idéia central do princípio da inversão de dependência é a programação orientada à interface. Ainda usaremos um exemplo para ilustrar onde a programação orientada para interface é melhor do que a programação orientada para a implementação. A cena é assim: a mãe conta uma história para seu filho. Enquanto ela lhe der um livro, ela pode contar histórias ao filho de acordo com o livro.
exemplo:
Inversão de dependência ilegal
public class Student {public void Read (livro do livro) {System.out.println ("O aluno começa a ler:"+book.getName ()); }} public class Book {public String getName () {return "Book"; }}
Quando os alunos precisam ler páginas da web, eles precisam modificar a aula de estudante, que é um design muito hostil. Vejamos o exemplo de aderir ao princípio da inversão da dependência.
Pessoa da interface pública {public void Read (leitor leitor); } Public Interface Reader {public String getName (); } classe pública Estudante implementa a pessoa {@Override public void Read (Reader Reader) {System.out.println ("Aluno inicia a leitura:"+leitor.getName ()); }} classe pública Livro implementa o leitor {public string getName () {return "book"; }} site da classe pública implementa o leitor {public string getName () {return "web página"; }} public class Test {public static void main (string [] args) {pessoa estudante = new Student (); estudante.read (novo livro ()); estudante.read (novo site ()); }}
No método de leitura, usamos a interface como um parâmetro.
Resumir:
1. É melhor ter interfaces ou classes abstratas para cada classe, ou interfaces e classes abstratas.
2. A declaração variável é preferencialmente uma interface ou uma classe abstrata.
3. Permaneça pelo princípio da substituição durante a herança.