Maison Java javaDidacticiel Exemples détaillés du principe d'inversion de dépendance en Java

Exemples détaillés du principe d'inversion de dépendance en Java

Aug 11, 2017 am 10:12 AM
java 原则

Cet article présente principalement la définition du principe d'inversion de dépendance Java et la solution au problème. Les amis intéressés devraient y jeter un œil ensemble

Définition : Les modules de haut niveau ne devraient pas. dépendent de modules de bas niveau, les deux devraient dépendre de leurs abstractions ; les détails ne devraient pas dépendre des abstractions ;

Origine du problème : La classe A dépend directement de la classe B. Si vous souhaitez changer la classe A pour qu'elle dépende de la classe C, vous devez modifier le code de la classe A. Dans ce scénario, la classe A est généralement un module de haut niveau responsable d'une logique métier complexe ; les classes B et C sont des modules de bas niveau responsables des opérations atomiques de base ; si la classe A est modifiée, cela entraînera des risques inutiles pour le programme.

Solution : Modifiez la classe A pour qu'elle dépende de l'interface I. La classe B et la classe C implémentent chacune l'interface I. La classe A contacte indirectement la classe B ou la classe C via l'interface I, cela sera alors grandement réduire les risques de modification de la catégorie A.

Le principe d'inversion de dépendance repose sur le fait que les choses abstraites sont bien plus stables que la variabilité des détails. Une architecture construite sur l’abstraction est bien plus stable qu’une architecture construite sur les détails. En Java, l'abstraction fait référence à des interfaces ou à des classes abstraites, et les détails sont des classes d'implémentation spécifiques. Le but de l'utilisation d'interfaces ou de classes abstraites est de formuler des spécifications et des contrats sans impliquer d'opérations spécifiques, laissant la tâche de montrer les détails à leur classe d'implémentation. complet.

L'idée centrale du principe d'inversion de dépendance est la programmation orientée interface. Nous utilisons toujours un exemple pour illustrer en quoi la programmation orientée interface est meilleure que la programmation orientée implémentation. La scène est la suivante : une mère raconte une histoire à son enfant. Tant qu'on lui donne un livre, elle peut raconter l'histoire à son enfant selon le livre. Le code est le suivant :


class Book{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(Book book){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(book.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
 } 
}
Copier après la connexion

Résultat courant :

Maman a commencé à raconter des histoires

depuis longtemps Il y avait une histoire arabe il y a longtemps...

Elle tourne bien Si un jour, la demande devient comme ça : au lieu de donner un livre, donnez-en un. journal, et laissez la mère raconter l'histoire dans le journal , le code du journal est le suivant :


class Newspaper{ 
 public String getContent(){ 
  return "林书豪38+7领导尼克斯击败湖人……"; 
 } 
}
Copier après la connexion

Cette mère ne peut pas le faire parce qu'elle Je ne peux pas lire l'histoire dans le journal. C'est ridicule. Si le livre est remplacé par un journal, la mère doit être modifiée pour le lire. Que se passe-t-il si je dois passer à un magazine à l'avenir ? Et si on le remplaçait par une page web ? Vous devez constamment modifier la Mère, ce qui n'est évidemment pas une bonne conception. La raison en est que le couplage entre la Mère et le Livre est trop élevé et le couplage entre eux doit être réduit.

Nous introduisons une interface abstraite IReader. Les lectures, tant qu'elles contiennent des mots, sont des lectures :


interface IReader{ 
 public String getContent(); 
} 
Mother类与接口IReader发生依赖关系,而Book和Newspaper都属于读物的范畴,他们各自都去实现IReader接口,这样就符合依赖倒置原则了,代码修改为:
class Newspaper implements IReader { 
 public String getContent(){ 
  return "林书豪17+9助尼克斯击败老鹰……"; 
 } 
} 
class Book implements IReader{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(IReader reader){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(reader.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
  mother.narrate(new Newspaper()); 
 } 
}
Copier après la connexion

Résultats en cours :

Maman a commencé à raconter des histoires
A See More très, très longtemps Il y avait une histoire arabe...
Maman a commencé à raconter l'histoire

Jeremy Lin a aidé les Knicks à vaincre les Hawks avec 17+9...

Après cette modification, peu importe la façon dont vous étendez la classe Client à l'avenir, vous n'avez plus besoin de modifier la classe Mère. Ceci n'est qu'un exemple simple. Dans des situations réelles, la classe Mère représentant le module de haut niveau sera chargée de compléter la logique métier principale une fois qu'elle devra être modifiée, le risque d'introduire des erreurs est extrêmement élevé. Par conséquent, suivre le principe de l'inversion des dépendances peut réduire le couplage entre les classes, améliorer la stabilité du système et réduire les risques liés à la modification du programme.

L'adoption du principe d'inversion de dépendance apporte une grande commodité au développement parallèle à plusieurs personnes. Par exemple, dans l'exemple ci-dessus, lorsque la classe Mère et la classe Livre étaient à l'origine directement couplées, la classe Mère avait. attendre que la classe Book soit codée. Le codage peut être effectué car la classe Mother dépend de la classe Book. Les programmes modifiés peuvent être démarrés en même temps sans s'influencer mutuellement, car les classes Mère et Livre n'ont rien à voir les unes avec les autres. Plus il y a de personnes impliquées dans le développement collaboratif et plus le projet est vaste, plus il est important d'adopter le principe de dépendance. Le modèle de développement TDD, désormais populaire, est l'application la plus réussie du principe d'inversion de dépendance.

Il existe trois façons de transférer les dépendances. La méthode utilisée dans l'exemple ci-dessus est le transfert d'interface. Il existe également deux méthodes de transfert : le transfert de méthode constructeur et le transfert de méthode setter. Framework Spring, vous devez être familier avec la façon dont les dépendances sont transmises.
Dans la programmation réelle, nous devons généralement faire les trois points suivants :

  • Les modules de bas niveau doivent avoir des classes ou des interfaces abstraites, ou les deux.

  • Le type déclaré de la variable doit être autant que possible une classe ou une interface abstraite.

  • Suivez le principe de substitution de Liskov lors de l'utilisation de l'héritage.

Le cœur du principe d'inversion de dépendance est que nous programmons pour les interfaces. Si nous comprenons la programmation orientée interface, nous comprenons également l'inversion de dépendance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles