Heim Java javaLernprogramm Detaillierte Beispiele für das Abhängigkeitsinversionsprinzip in Java

Detaillierte Beispiele für das Abhängigkeitsinversionsprinzip in Java

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

Dieser Artikel stellt hauptsächlich die Definition des Java-Abhängigkeitsinversionsprinzips und die Lösung des Problems vor. Freunde, die interessiert sind, sollten einen Blick darauf werfen

Definition: High-Level-Module sollten nicht hängen von Low-Level-Modulen ab, beide sollten von ihren Abstraktionen abhängen; Abstraktionen sollten nicht von Details abhängen, sollten von Abstraktionen abhängen;

Ursprung des Problems: Klasse A hängt direkt von Klasse B ab. Wenn Sie Klasse A so ändern möchten, dass sie von Klasse C abhängt, müssen Sie den Code von Klasse A ändern. In diesem Szenario ist Klasse A im Allgemeinen ein High-Level-Modul, das für komplexe Geschäftslogik verantwortlich ist. Die Klassen B und C sind Low-Level-Module, die für grundlegende atomare Operationen verantwortlich sind. Wenn Klasse A geändert wird, birgt dies unnötige Risiken für das Programm.

Lösung: Ändern Sie Klasse A so, dass sie von Schnittstelle I abhängt. Klasse B und Klasse C implementieren jeweils Schnittstelle I. Klasse A kontaktiert Klasse B oder Klasse C indirekt über Schnittstelle I, dann wird es stark Reduzieren Sie die Wahrscheinlichkeit einer Änderung der Kategorie A.

Das Prinzip der Abhängigkeitsinversion basiert auf der Tatsache, dass abstrakte Dinge viel stabiler sind als die Variabilität von Details. Eine auf Abstraktion basierende Architektur ist viel stabiler als eine auf Details basierende Architektur. In Java bezieht sich Abstraktion auf Schnittstellen oder abstrakte Klassen, und Details sind spezifische Implementierungsklassen. Der Zweck der Verwendung von Schnittstellen oder abstrakten Klassen besteht darin, Spezifikationen und Verträge zu formulieren, ohne dass bestimmte Operationen erforderlich sind, und überlässt die Aufgabe, die Details ihrer Implementierungsklasse anzuzeigen vollständig.

Die Kernidee des Abhängigkeitsinversionsprinzips ist die schnittstellenorientierte Programmierung. Wir veranschaulichen anhand eines Beispiels, dass die schnittstellenorientierte Programmierung besser ist als die umsetzungsorientierte Programmierung. Die Szene sieht so aus: Eine Mutter erzählt ihrem Kind eine Geschichte, solange ihr ein Buch gegeben wird. Der Code lautet wie folgt:


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()); 
 } 
}
Nach dem Login kopieren

Laufendes Ergebnis:

Mama hat angefangen, Geschichten zu erzählen

Vor langer Zeit gab es eine arabische Geschichte...

Es läuft gut. Wenn die Nachfrage eines Tages so wird: Statt ein Buch zu verschenken, gib ein Zeitung, und lassen Sie die Mutter die Geschichte in der Zeitung erzählen. Der Code der Zeitung lautet wie folgt:


class Newspaper{ 
 public String getContent(){ 
  return "林书豪38+7领导尼克斯击败湖人……"; 
 } 
}
Nach dem Login kopieren

Diese Mutter kann es nicht, weil sie Ich kann die Geschichte nicht in der Zeitung lesen. Das ist einfach lächerlich. Wenn das Buch durch eine Zeitung ersetzt wird, muss die Mutter dazu gebracht werden, es zu lesen. Was passiert, wenn ich in Zukunft auf eine Zeitschrift umsteigen muss? Wie wäre es, es durch eine Webseite zu ersetzen? Man muss die Mutter ständig modifizieren, was offensichtlich kein gutes Design ist. Der Grund dafür ist, dass die Kopplung zwischen Mutter und Buch zu hoch ist und die Kopplung zwischen ihnen verringert werden muss.

Wir stellen eine abstrakte Schnittstelle IReader vor. Lesungen, solange sie Wörter enthalten, sind Lesungen:


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()); 
 } 
}
Nach dem Login kopieren

Laufende Ergebnisse:

Mama hat angefangen, Geschichten zu erzählen
A Lange, lange Zeit. Früher gab es eine arabische Geschichte...
Mama begann, die Geschichte zu erzählen

Jeremy Lin half den Knicks, die Hawks mit 17+9 zu besiegen...

Nach dieser Änderung besteht keine Notwendigkeit, die Mutterklasse zu ändern, egal wie Sie die Client-Klasse in Zukunft erweitern. Dies ist nur ein einfaches Beispiel. In tatsächlichen Situationen ist die Mutterklasse, die das übergeordnete Modul darstellt, für die Vervollständigung der Hauptgeschäftslogik verantwortlich. Sobald diese geändert werden muss, ist das Risiko der Einführung von Fehlern extrem hoch. Daher kann die Befolgung des Abhängigkeitsinversionsprinzips die Kopplung zwischen Klassen verringern, die Stabilität des Systems verbessern und die durch Programmänderungen verursachten Risiken verringern.

Die Übernahme des Abhängigkeitsinversionsprinzips bringt großen Komfort für die parallele Entwicklung mit mehreren Personen. Im obigen Beispiel waren beispielsweise die Mutterklasse und die Buchklasse ursprünglich direkt gekoppelt Warten Sie, bis die Buchklasse kodiert ist. Die Kodierung kann durchgeführt werden, da die Mutterklasse von der Buchklasse abhängt. Die geänderten Programme können gleichzeitig gestartet werden, ohne dass sie sich gegenseitig beeinflussen, da die Klassen Mother und Book nichts miteinander zu tun haben. Je mehr Menschen an der kollaborativen Entwicklung beteiligt sind und je größer das Projekt ist, desto bedeutsamer ist die Übernahme des Abhängigkeitsprinzips. Das mittlerweile beliebte TDD-Entwicklungsmodell ist die erfolgreichste Anwendung des Abhängigkeitsinversionsprinzips.

Es gibt drei Möglichkeiten, Abhängigkeiten zu übertragen. Es gibt auch zwei Übertragungsmethoden: Konstruktormethodenübertragung und Settermethodenübertragung Spring Framework. Sie müssen mit der Art und Weise vertraut sein, wie Abhängigkeiten übergeben werden.
Bei der eigentlichen Programmierung müssen wir im Allgemeinen die folgenden drei Punkte tun:

  • Low-Level-Module sollten abstrakte Klassen oder Schnittstellen oder beides haben.

  • Der deklarierte Typ der Variablen sollte möglichst eine abstrakte Klasse oder Schnittstelle sein.

  • Befolgen Sie bei der Verwendung der Vererbung das Liskov-Substitutionsprinzip.

Der Kern des Abhängigkeitsinversionsprinzips besteht darin, dass wir für Schnittstellen programmieren. Wenn wir schnittstellenorientierte Programmierung verstehen, verstehen wir auch Abhängigkeitsinversion.

Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele für das Abhängigkeitsinversionsprinzip in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

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

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles