Les modèles de conception GoF sont également masqués dans les bibliothèques Java que vous utilisez le plus souvent. Il est facile d'oublier le travail quotidien chargé, mais de temps en temps, profitons du beau design qui peut être considéré comme une sorte d'art.
Commun
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
Logger logger = LoggerFactory.getLogger(this.getClass());
...
Motif 1-Lors de l'utilisation de Logback
- slf4j-api-VERSION.jar
- logback-classic-VERSION.jar
- logback-core-VERSION.jar
Motif 2-Lors de l'utilisation de Log4j
- slf4j-api-VERSION.jar
- slf4j-log4j12-VERSION.jar
- log4j-VERSION.jar
Motif 3 - Lors de l'utilisation de l'enregistreur standard Java
- slf4j-api-VERSION.jar
- slf4j-jdk14-VERSION.jar
- rt.jar (Parce que c'est une bibliothèque Java principale, c'est du début)
Il s'agit d'une scène pour générer un enregistreur Java (SLF4J). Vous pouvez choisir librement l'implémentation du logger en remplaçant simplement le fichier jar ajouté au chemin de classe tout en conservant le code source. Je ressens l'art de la séparation très nette entre l'interface et la mise en œuvre.
Puisqu'il existe différentes bibliothèques de journalisation Java [^ 2], je pense que vous en utilisez souvent différentes pour chaque projet. Lorsque j'essaie d'utiliser la source d'un autre projet dans mon propre projet, si l'enregistreur utilisé est différent, je dois modifier le code source, ou je dois gérer le fichier de configuration de l'enregistreur deux fois. Ce ne sera pas beau.
Le point de vue cette fois est qu'en préparant une classe d'adaptateur, vous pouvez l'utiliser de la même manière même si vous remplacez la classe d'implémentation (logger). De plus, la méthode classique mais la plus simple pour remplacer la classe d'implémentation consiste simplement à remplacer le fichier jar. En plus de la beauté du design, nous sommes impressionnés par le design intelligent du designer pour nous qui utilisons la bibliothèque. Regardons-le ensemble ci-dessous.
Si vous écrivez le code au début sans utiliser le modèle d'adaptateur, ce sera comme suit.
Motif 1-Lors de l'utilisation de Logback
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.Logger;
...
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger log = lc.getLogger(this.getClass());
Motif 2-Lors de l'utilisation de Log4j
import org.apache.log4j.Logger;
...
Logger logger = Logger.getLogger(this.getClass());
Motif 3 - Lors de l'utilisation de l'enregistreur standard Java
import java.util.logging.Logger;
...
Logger logger = Logger.getLogger(this.getClass());
La description au moment de l'acquisition de l'instance et la description de l'instruction d'importation sont différentes pour chaque enregistreur. De plus, comme la classe Logger
à instancier est différente, les méthodes qui peuvent être utilisées pour chacune sont également différentes. Si vous modifiez la bibliothèque de journalisation dans cet état, vous finirez par remplacer beaucoup de code source. De plus, si vous utilisiez une méthode qui n'existe que dans une bibliothèque de journalisation particulière, vous ne pouvez même pas la remplacer.
Le code au début utilise le modèle d'adaptateur. Regardons à nouveau.
Le premier est le fichier jar à ajouter au chemin de classe. Chaque bibliothèque de journalisation a trois fichiers jar, mais ils ont le même rôle,
Il est devenu.
Le tableau ci-dessous présente les types de bibliothèques de journalisation et les rôles des fichiers JAR.
Logback | Log4j | Enregistreur standard Java | |
---|---|---|---|
IF commun | slf4j-api-VERSION.jar | Idem à gauche | Idem à gauche |
Implémentation IF (adaptateur) | logback-classic-VERSION.jar | slf4j-log4j12-VERSION.jar | slf4j-jdk14-VERSION.jar |
Implémentation de la bibliothèque de journalisation | logback-core-VERSION.jar | log4j-VERSION.jar | rt.jar |
Ensuite, quelle que soit la bibliothèque de journalisation que vous utilisez, l'instance de journalisation sera générée uniformément comme suit.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
Logger logger = LoggerFactory.getLogger(this.getClass());
...
Le contenu de cette méthode getLogger
est le suivant.
java:org.slf4j.LoggerFactory.java
package org.slf4j;
...
//Classes dans le pot IF commun
public final class LoggerFactory {
...
public static Logger getLogger(String name) {
// org.slf4j.Créer une instance de ILoggerFactory
//La classe d'implémentation est la classe dans le jar de l'implémentation IF (adaptateur) (voir tableau ci-dessous)
ILoggerFactory iLoggerFactory = getILoggerFactory();
// org.slf4j.Créer une instance de Logger
//La classe d'implémentation est la classe dans le jar de l'implémentation IF (adaptateur) (voir tableau ci-dessous)
return iLoggerFactory.getLogger(name);
}
...
}
Les classes d'implémentation ʻILoggerFactory et
Logger` sont les suivantes. Les deux classes sont incluses dans le jar d'implémentation IF (adaptateur) de leur bibliothèque de journalisation.
Logback | Log4j | Enregistreur standard Java | |
---|---|---|---|
Classe d'implémentation de ILoggerFactory | ch.qos.logback.classic.LoggerContext | org.slf4j.impl.Log4jLoggerFactory | org.slf4j.jul.JDK14LoggerFactory |
org.slf4j.Classe d'implémentation de l'enregistreur | ch.qos.logback.classic.Logger | org.slf4j.impl.Log4jLoggerAdapter | org.slf4j.jul.JDK14LoggerAdapter |
Si vous suivez ce code source, vous pouvez voir que les instances LoggerFactory
et Logger
sont créées dans le flux suivant. Le fichier dans lequel chaque classe est incluse est écrit entre []. Il est facile de comprendre si vous en êtes conscient.
Pour Logback
org.slf4j.LoggerFactory [jar IF commun]
↓
↓ org/slf4j/impl/StaticLoggerBinder.fichier de classe
↓ Rechercher et instancier
↓
org.slf4j.impl.StaticLoggerBinder [jar d'implémentation IF (adaptateur)]
↓
↓ org.slf4j.Interface ILoggerFactory
Instancier LoggerContext qui implémente ↓
↓
ch.qos.logback.classic.LoggerContext [jar d'implémentation IF (adaptateur)]
↓
↓ org.slf4j.Interface de l'enregistreur
Ch qui implémente ↓.qos.logback.classic.Instantiate Logger
↓
ch.qos.logback.classic.Logger [jar d'implémentation IF (adaptateur)]
Le fait est que le Logger
finalement généré n'est pas une classe incluse dans le jar d'implémentation de la bibliothèque de journalisation, mais une classe incluse dans le jar d'implémentation IF. Cette classe contient une référence à la bibliothèque de journalisation dans une variable membre et l'appelle lors de la journalisation.
En faisant ce qui précède, la personne qui utilise SLF4J ne fera pas directement référence à l'instance de la bibliothèque de journalisation, mais se référera à la classe d'implémentation IF correspondant à l'adaptateur.
Pour Logback
Les personnes qui utilisent SLF4J
↓
↓ Utiliser
↓
org.slf4j.Enregistreur [jar IF commun]
Cette entité est ch.qos.logback.classic.Logger [jar d'implémentation IF (adaptateur)]
↓
↓ Utilisé en interne
↓
ch.qos.logback.core.XXXAppender [jar d'implémentation de la bibliothèque de journalisation]
Le modèle d'adaptateur est parfois appelé modèle Wrapper. ** Enveloppez dans une nouvelle classe pour faciliter l'utilisation d'une classe difficile à utiliser telle quelle **. À propos, une classe qui est difficile à utiliser telle quelle est une classe dans laquelle il n'y a pas de sens d'unité dans les méthodes entre des classes similaires ou le code source est sale.
Pas étonnant que l'interface SLF4J soit propre. C'est le résultat du formatage avec le modèle d'adaptateur dans le but de nettoyer.
Pour cet exemple, j'ai choisi celui qui maximise l'attractivité du pattern Adapter, mais même si je ne le fais pas à fond (implémentation IF, IF, implémentation de la bibliothèque de journalisation, je n'ai pas à séparer les fichiers jar) ), ** Créez simplement une classe wrapper pour une classe difficile à utiliser telle quelle, et vous utilisez le modèle Adapter **.
De nombreux experts ont également commenté le modèle d'adaptateur.
Hiroshi Yuki
Même dans le monde de la programmation, lorsque ce qui est déjà fourni ne peut pas être utilisé tel quel, il est souvent converti à la forme requise puis utilisé. Le modèle d'adaptateur est un modèle de conception qui comble le «fossé» entre «ce qui est déjà fourni» et «ce dont vous avez besoin». ["Introduction aux modèles de conception appris en langage Java"](https://www.amazon.co.jp/ Introduction aux modèles de conception appris en langage Java-Yuki-Hiroshi / dp / 4797327030 /)
lang_and_engine
Si vous utilisez correctement le modèle Adapter, cela a également pour effet d'améliorer les relations interpersonnelles au sein de l'équipe de développement. Quand une personne peu qualifiée a écrit un désordre de code, quand un autre membre a essayé de réécrire le code source de la classe depuis le côté, le premier programmeur qui l'a codé a été "blessé". Je le sens. Afin d'éviter cela, la classe wrapper est encore développée pour améliorer le côté classe wrapper et améliorer la qualité.
C'est le vrai plaisir d'un programmeur de pouvoir jouir d'un plaisir intellectuel en regardant simplement une seule ligne de code sans avoir à se rendre au musée.
Si vous êtes un ingénieur qui sympathise avec l'art du modèle Adapter, veuillez contacter le responsable du recrutement de notre société (Qualysite Technologies Co., Ltd.). Contactez SVP!
[^ 1]: Dans la scène de développement actuelle, utilisez un outil de gestion de module tel que Maven pour ajouter le fichier jar. Veuillez vous référer à Référence officielle de SLF4J ici pour la méthode de description dans le fichier de configuration (pom.xml) de Maven.
[^ 2]: [J'ai essayé de l'organiser car il y a trop de java loggers donc je ne comprends pas](http://www.bunkei-programmer.net/entry/2012/10/20/ java loggers Je ne comprends pas pourquoi il y en a trop, alors organisez-les)
Recommended Posts