[GO] Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Adaptermuster

GoF-Entwurfsmuster sind auch in den Java-Bibliotheken versteckt, die Sie am häufigsten verwenden. Es ist leicht, die geschäftige tägliche Arbeit zu übersehen, aber ab und zu genießen wir das schöne Design, das man als eine Art Kunst bezeichnen kann.

Diese Kunst

Quelldatei

Verbreitet


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...

Logger logger = LoggerFactory.getLogger(this.getClass());
...

Jar-Datei zum Klassenpfad hinzufügen [^ 1]

Muster 1 - Bei Verwendung von Logback


- slf4j-api-VERSION.jar
- logback-classic-VERSION.jar
- logback-core-VERSION.jar

Muster 2 - Bei Verwendung von Log4j


- slf4j-api-VERSION.jar
- slf4j-log4j12-VERSION.jar
- log4j-VERSION.jar

Muster 3 - Bei Verwendung des Java-Standardloggers


- slf4j-api-VERSION.jar
- slf4j-jdk14-VERSION.jar
- rt.jar (Da es sich um eine Java-Kernbibliothek handelt, ist dies von Anfang an der Fall.)

Dies ist eine Szene zum Generieren eines Java-Loggers (SLF4J). Sie können die Logger-Implementierung frei wählen, indem Sie einfach die dem Klassenpfad hinzugefügte JAR-Datei ersetzen und dabei den Quellcode beibehalten. Ich spüre die Kunst der sehr sauberen Trennung zwischen der Schnittstelle und der Implementierung.

Anerkennungspunkte

Da es verschiedene Java-Protokollierungsbibliotheken gibt [^ 2], denke ich, dass Sie für jedes Projekt häufig unterschiedliche verwenden. Wenn ich versuche, die Quelle eines anderen Projekts in meinem eigenen Projekt zu verwenden, muss ich den Quellcode ändern oder die Einstellungsdatei des Loggers zweimal verwalten, wenn der verwendete Logger anders ist. Es wird nicht schön sein.

Wenn Sie diesmal eine Adapterklasse vorbereiten, können Sie sie auf die gleiche Weise verwenden, auch wenn Sie die Implementierungsklasse (Logger) ersetzen. Darüber hinaus besteht die klassische, aber einfachste Methode zum Ersetzen der Implementierungsklasse darin, das JAR einfach zu ersetzen. Neben der Schönheit des Designs beeindrucken wir das intelligente Design des Designers für uns, die wir die Bibliothek nutzen. Schauen wir es uns unten gemeinsam an.

Wenn Sie das Adaptermuster nicht verwenden

Wenn Sie den Code zu Beginn ohne Verwendung des Adaptermusters schreiben, sieht er wie folgt aus.

Muster 1 - Bei Verwendung von Logback


import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.Logger;
...

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger log = lc.getLogger(this.getClass());

Muster 2 - Bei Verwendung von Log4j


import org.apache.log4j.Logger;
...

Logger logger = Logger.getLogger(this.getClass());

Muster 3 - Bei Verwendung des Java-Standardloggers


import java.util.logging.Logger;
...

Logger logger = Logger.getLogger(this.getClass());

Die Beschreibung zum Zeitpunkt der Instanzerfassung und die Beschreibung der Importanweisung sind für jeden Logger unterschiedlich. Da die zu instanziierende "Logger" -Klasse unterschiedlich ist, sind auch die Methoden, die für jede Klasse verwendet werden können, unterschiedlich. Wenn Sie die Protokollierungsbibliothek in diesem Status ändern, werden Sie am Ende viel Quellcode ersetzen. Wenn Sie eine Methode verwenden, die nur in einer bestimmten Protokollierungsbibliothek vorhanden ist, können Sie diese nicht einmal ersetzen.

Bei Verwendung des Adaptermusters

Der Code am Anfang verwendet das Adaptermuster. Lass uns noch einmal schauen.

Zunächst wird die JAR-Datei zum Klassenpfad hinzugefügt. Jede Protokollierungsbibliothek verfügt über drei JAR-Dateien, die jedoch dieselbe Rolle haben.

Es ist geworden.

Die folgende Tabelle zeigt die Arten von Protokollierungsbibliotheken und die Rollen von Jars.

Logback Log4j Java Standard Logger
Gemeinsame IF slf4j-api-VERSION.jar Gleich links Gleich links
IF-Implementierung (Adapter) logback-classic-VERSION.jar slf4j-log4j12-VERSION.jar slf4j-jdk14-VERSION.jar
Implementierung der Protokollierungsbibliothek logback-core-VERSION.jar log4j-VERSION.jar rt.jar

Unabhängig davon, welche Protokollierungsbibliothek Sie verwenden, wird die Protokollierungsinstanz wie folgt einheitlich generiert.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...

Logger logger = LoggerFactory.getLogger(this.getClass());
...

Der Inhalt dieser getLogger-Methode lautet wie folgt.

java:org.slf4j.LoggerFactory.java


package org.slf4j;
...

//Klassen im gemeinsamen IF-Glas
public final class LoggerFactory {
    ...
    public static Logger getLogger(String name) {

        // org.slf4j.Erstellen Sie eine Instanz von ILoggerFactory
        //Die Implementierungsklasse ist die Klasse im JAR der IF-Implementierung (Adapter) (siehe Tabelle unten).
        ILoggerFactory iLoggerFactory = getILoggerFactory();

        // org.slf4j.Erstellen Sie eine Instanz von Logger
        //Die Implementierungsklasse ist die Klasse im JAR der IF-Implementierung (Adapter) (siehe Tabelle unten).
        return iLoggerFactory.getLogger(name);
    }
    ...
}

Die Implementierungsklassen für "ILoggerFactory" und "Logger" sind wie folgt. Beide Klassen sind im IF-Implementierungsglas (Adapter) ihrer Protokollierungsbibliothek enthalten.

Logback Log4j Java Standard Logger
Implementierungsklasse von ILoggerFactory ch.qos.logback.classic.LoggerContext org.slf4j.impl.Log4jLoggerFactory org.slf4j.jul.JDK14LoggerFactory
org.slf4j.Logger-Implementierungsklasse ch.qos.logback.classic.Logger org.slf4j.impl.Log4jLoggerAdapter org.slf4j.jul.JDK14LoggerAdapter

Wenn Sie diesem Quellcode folgen, können Sie sehen, dass die Instanzen "LoggerFactory" und "Logger" im folgenden Ablauf erstellt werden. In welchem Glas jede Klasse enthalten ist, steht in []. Es ist leicht zu verstehen, wenn Sie sich dessen bewusst sind.

Für Logback


org.slf4j.LoggerFactory [allgemeines IF-Glas]
     ↓
     ↓ org/slf4j/impl/StaticLoggerBinder.Klassendatei
↓ Suchen und instanziieren
     ↓
org.slf4j.impl.StaticLoggerBinder [IF-Implementierungsglas (Adapter)]
     ↓
     ↓ org.slf4j.ILoggerFactory-Schnittstelle
Instanziieren Sie LoggerContext, der ↓ implementiert
     ↓
ch.qos.logback.classic.LoggerContext [JAR für IF-Implementierung (Adapter)]
     ↓
     ↓ org.slf4j.Logger-Schnittstelle
Ch, das ↓ implementiert.qos.logback.classic.Instantiate Logger
     ↓
ch.qos.logback.classic.Logger [IF Implementierungs (Adapter) jar]

Der Punkt ist, dass der endgültig generierte "Logger" keine Klasse ist, die im Implementierungsglas der Protokollierungsbibliothek enthalten ist, sondern eine Klasse, die im IF-Implementierungsglas enthalten ist. Diese Klasse enthält einen Verweis auf die Protokollierungsbibliothek in einer Mitgliedsvariablen und ruft ihn beim Protokollieren auf.

Auf diese Weise verweist die Person, die SLF4J verwendet, nicht direkt auf die Instanz der Protokollierungsbibliothek, sondern auf die dem Adapter entsprechende IF-Implementierungsklasse.

Für Logback


Menschen, die SLF4J verwenden
 ↓
↓ Verwenden
 ↓
org.slf4j.Logger [allgemeines IF-Glas]
Diese Entität ist ch.qos.logback.classic.Logger [IF Implementierungs (Adapter) jar]
   ↓
↓ Wird intern verwendet
   ↓
  ch.qos.logback.core.XXXAppender [Implementierungsglas für Protokollierungsbibliothek]

Zusammenfassung des Adaptermusters

Das Adaptermuster wird manchmal als Wrapper-Muster bezeichnet. ** Schließen Sie eine neue Klasse ein, um die Verwendung von Klassen zu vereinfachen, die so wie sie sind schwierig zu verwenden sind **. Übrigens ist eine Klasse, die schwer zu verwenden ist, eine Klasse, in der es kein Gefühl der Einheit zwischen Methoden zwischen ähnlichen Klassen gibt oder der Quellcode schmutzig ist.

Kein Wunder, dass die SLF4J-Schnittstelle sauber sein sollte. Dies ist das Ergebnis der Formatierung mit dem Adaptermuster zum Zwecke der Bereinigung.

In diesem Beispiel habe ich das ausgewählt, das die Attraktivität des Adaptermusters maximiert, aber selbst wenn ich es nicht gründlich mache (IF, IF-Implementierung, Implementierung der Protokollierungsbibliothek, muss ich die JAR-Dateien nicht trennen). ), ** Erstellen Sie einfach eine Wrapper-Klasse für eine Klasse, die so wie sie ist schwierig zu verwenden ist, und Sie verwenden das Adaptermuster **.

Expertenmeinungen zum Adaptermuster

Viele Experten haben auch das Adaptermuster kommentiert.

Hiroshi Yuki

Selbst in der Welt der Programmierung wird das, was bereits bereitgestellt wurde, nicht vor seiner Verwendung verwendet, sondern häufig vor der Verwendung in die erforderliche Form konvertiert. Das Adaptermuster ist ein Entwurfsmuster, das die "Lücke" zwischen "was bereits bereitgestellt ist" und "was Sie benötigen" schließt. ["Einführung in in Java-Sprache erlernte Entwurfsmuster"](https://www.amazon.co.jp/ Einführende in Java-Sprache erlernte Entwurfsmuster-Yuki-Hiroshi / dp / 4797327030 /)

lang_and_engine

Wenn Sie das Adaptermuster gut verwenden, verbessert es auch die zwischenmenschlichen Beziehungen innerhalb des Entwicklungsteams. Wenn eine gering qualifizierte Person ein Durcheinander von Code schrieb und ein anderes Mitglied versuchte, den Quellcode der Klasse von der Seite neu zu schreiben, war der erste Programmierer, der ihn codierte, "verletzt". Ich fühle es. Um dies zu vermeiden, wird die Wrapper-Klasse weiter erweitert, um die Wrapper-Klassenseite zu verbessern und die Qualität zu verbessern.

Aus Liste der 23 GoF-Entwurfsmuster für die Verwendung in Java

Schließlich

Es ist das wahre Vergnügen eines Programmierers, intellektuellen Genuss genießen zu können, indem er nur eine einzige Codezeile betrachtet, ohne ins Museum gehen zu müssen.

Wenn Sie ein Ingenieur sind, der mit der Kunst des Adaptermusters einverstanden ist, wenden Sie sich bitte an den Einstellungsmanager unseres Unternehmens (Qualysite Technologies Co., Ltd.). Kontaktieren Sie bitte!

Referenz-URL

In Verbindung stehender Artikel

Erstellen Sie eine Instanz

Vereinfachen Sie die Schnittstelle

Überlasse es einer anderen Klasse

Fußnote

[^ 1]: Verwenden Sie in der eigentlichen Entwicklungsszene ein Modulverwaltungstool wie Maven, um die JAR-Datei hinzuzufügen. Die Beschreibungsmethode in der Maven-Einstellungsdatei (pom.xml) finden Sie unter Offizielle Referenz von SLF4J hier.

[^ 2]: [Ich habe versucht, es zu organisieren, weil es zu viele Java-Logger gibt, so dass ich es nicht verstehe](http://www.bunkei-programmer.net/entry/2012/10/20/ Java-Logger Ich verstehe nicht, warum es zu viele gibt, also organisiere sie)

Recommended Posts

Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Adaptermuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Builder-Muster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Strategiemuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster
Mit Java & PHP erlernte Entwurfsmuster (Zusammenfassung)
Docker. Setzen Sie häufig verwendete Befehle auf den Alias "mit Erklärung".
[Von Zeit zu Zeit aktualisiert] Zusammenfassung der Entwurfsmuster in Java
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden