[JAVA] Exemple d'application du modèle de conception (n ° 1)

en premier

** "Il est facile de rendre les choses simples compliquées, mais il est difficile de rendre les choses compliquées faciles" ** est ma théorie.

Sur le terrain, lorsqu'on leur confie une tâche, on voit souvent des programmeurs essayer de résoudre des problèmes en alignant le code sans trop réfléchir. Encore et encore, le code source devient de plus en plus complexe, illisible et non maintenable.

C'est une bonne idée de considérer le mécanisme et l'algorithme autant que possible avant de commencer. Cela rend non seulement les problèmes qui semblent compliqués (dans certains cas dramatiquement) simples, mais apporte également d'autres avantages tels qu'une réutilisabilité accrue et une productivité accrue.

Les modèles de conception sont souvent utiles dans ce cas. Dans la mise en œuvre de fonctions de systèmes d'entreprise généraux, la plupart des fonctions courantes sont couvertes par le cadre et la bibliothèque commune, il y a donc peu d'occasions d'utiliser des modèles de conception. Cependant, il est souvent utilisé dans les frameworks et les bibliothèques communes sur lesquels il est basé. Beaucoup d'entre vous connaissent peut-être les modèles ci-dessous, mais ce sont ceux qui sont souvent utilisés.

Tâche

Ceci est un exemple de développement de produit, mais si vous avez des connaissances sur les modèles de conception, essayez de résoudre les problèmes suivants.

De nos jours, il est exagéré de dire que le développement de systèmes métier est inévitable pour l'utilisation des bibliothèques OSS, contrairement au passé. En parlant de bibliothèques OSS, certaines sont majeures et certaines ne sont pas bien connues. Quoi qu'il en soit, il sera amélioré ou éliminé en raison de l'évolution des temps. Dans ce cas, il existe des modèles de conception que nous utilisons souvent pour éviter autant que possible d'être affectés par les modifications de la bibliothèque.

Donc le problème: le développement Java utilise des bibliothèques JSON OSS telles que GSON et Jackson pour la conversion mutuelle entre les beans de données et les chaînes JSON. Supposons que vous puissiez remplacer cette bibliothèque par une autre à l'avenir. Comment appliquer le modèle de conception pour minimiser l'impact sur les sources existantes lors de la mise à niveau de la version de la bibliothèque utilisée ou de son remplacement par une autre bibliothèque? Pensez-y ici avant de regarder la seconde moitié de l'article.

Exemple de solution

Nous résolvons ce problème en utilisant le modèle d'adaptateur du modèle de conception. Ce n'est pas la seule solution, donc si vous avez d'autres commentaires, veuillez commenter. Si vous voulez connaître les détails du modèle d'adaptateur, veuillez vous référer à Apater pattern | TECK SCORE.

Lors de l'utilisation du modèle d'adaptateur, il existe les deux types de méthodes de montage suivants.

Il était nécessaire qu'elle puisse être remplacée par une autre bibliothèque à l'avenir, de sorte que l'utilisation de l'héritage aura un impact plus important sur les sources existantes. Ici, "l'implémentation utilisant la délégation" est adoptée.

Exemple d'implémentation

Voici un exemple d'implémentation. (Simplifié pour l'article.) Même si vous la remplacez par une autre bibliothèque à l'avenir, l'implémentation côté utilisateur devrait être en mesure de la gérer avec presque aucun changement.

Interface cible

package json;

import java.io.InputStream;
import java.io.OutputStream;

/**
 *
 *Interface cible JSON
 *
 */
public interface JsonAdapterIF {

    /**
     *Méthode cible(Lire la chaîne JSON)
     */
    <T> T read(String json, Class<T> type) throws Exception;

    /**
     *Méthode cible(Lire le flux d'entrée JSON)
     */
    <T> T read(InputStream is, Class<T> type) throws Exception;

    /**
     *Méthode cible(Écrire dans la chaîne JSON)
     */
    String write(Object obj) throws Exception;

    /**
     *Méthode cible(Écrire dans le flux de sortie JSON)
     */
    void write(Object obj, OutputStream os) throws Exception;

}

Adapter

package json;

import java.io.InputStream;
import java.io.OutputStream;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 *Classe d'adaptateur JSON(Jackson)。
 */
public class JacksonAdapter implements JsonAdapterIF {

    /** Adaptee (ObjectMapper de Jackson) */
    private ObjectMapper om;

    /**
     *Protégé afin que vous ne puissiez pas créer une instance d'Adaptateur directement du côté utilisateur
     *Le constructeur est masqué par un modificateur.
     */
    protected JacksonAdapter() {
        this(new ObjectMapper());
    }

    /**
     *Protégé afin que vous ne puissiez pas créer une instance d'Adaptateur directement du côté utilisateur
     *Le constructeur est masqué par un modificateur.
     */
    protected JacksonAdapter(ObjectMapper om) {
        // the om must not be null
        assert om != null;
        this.om = om;
    }

    @Override
    public <T> T read(String json, Class<T> type) throws Exception {
        return om.readValue(json, type);
    }

    @Override
    public <T> T read(InputStream is, Class<T> type) throws Exception {
        return om.readValue(is, type);
    }

    @Override
    public String write(Object obj) throws Exception {
        return om.writeValueAsString(obj);
    }

    @Override
    public void write(Object obj, OutputStream os) throws Exception {
        om.writeValue(os, obj);
    }

}

Usine (bonus)

package json;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 *Classe d'usine pour créer l'adaptateur JSON.
 *Puisqu'il n'est pas possible de créer une instance d'Adaptateur directement du côté client, une fabrique est fournie.
 */
public class JsonAdapterFactory {

    /** A thread safe map of JsonAdapter */
    private static Map<Class<?>, JsonAdapterIF> omMap = new ConcurrentHashMap<>();

    static {
        //Adaptateur JSON par défaut (pour toute classe)
        omMap.put(Object.class, new JacksonAdapter());

        //Créez un autre ObjectMapper si une initialisation spéciale est requise
        ObjectMapper om = new ObjectMapper();
        //Abréviation
        omMap.put(Classe spéciale.class, new JacksonAdapter(om));
    }

    private JsonAdapterFactory() {
    }

    /**
     *Obtenez l'adaptateur JSON par défaut.
     */
    public static JsonAdapterIF getJsonAdapter() {
        return omMap.get(Object.class);
    }

    /**
     *Obtention d'un adaptateur JSON pour une classe spéciale.
     */
    public static JsonAdapterIF getJsonAdapter(Class<?> clazz) {
        return omMap.get(clazz);
    }

}

Zhou @ Soft Sync

Recommended Posts

Exemple d'application du modèle de conception (n ° 1)
Modèle de conception ~ Chaîne de responsabilité ~
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Composite ~
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Exemple de conception / code des conditions d'affichage du menu de l'application Web
PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"
Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception ~ Méthode d'usine ~
Modèle de conception ~ Usine abstraite ~
[No.006] Conception approximative de l'écran de gestion de l'organisation et de la connexion
Exemple d'utilisation de vue.config.js
Modèle de chaîne de responsabilité
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Java8 Lambda Expression & Stream Design Pattern Repenser - Modèle de chaîne de responsabilité -
Exemple de paramètres utilisant where
Exemple d'utilisation d'une classe abstraite
[Design pattern] Bibliothèque de base Java
[Java] Résumé des modèles de conception