Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles d'adaptateur

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.

Cet art

fichier source

Commun


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

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

Fichier Jar à ajouter au chemin de classe [^ 1]

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.

Points d'appréciation

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.

Lorsque vous n'utilisez pas le modèle d'adaptateur

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.

Lors de l'utilisation du modèle d'adaptateur

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]

Résumé du modèle d'adaptateur

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 **.

Commentaires d'experts sur le modèle d'adaptateur

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é.

De Liste de 23 modèles de conception GoF à utiliser en Java

finalement

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!

URL de référence

Article associé

Créer une instance

Simplifiez l'interface

Laissez-le à une autre classe

note de bas de page

[^ 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

Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles d'adaptateur
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de constructeur
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles de stratégie
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de méthode de modèle
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de façade
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle abstrait Factory
Modèles de conception appris avec Java et PHP (résumé)
Docker. Définir les commandes fréquemment utilisées sur un alias "avec explication"
[Mis à jour de temps en temps] Résumé des modèles de conception en Java
Chapitre 4 Résumé de l'introduction aux modèles de conception appris en langage Java
Résumé du chapitre 3 de l'introduction aux modèles de conception appris en langage Java