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.
Verbreitet
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
Logger logger = LoggerFactory.getLogger(this.getClass());
...
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.
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 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.
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]
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 **.
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
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!
[^ 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