Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles de stratégie

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

Main.java


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {

    public static void main(String[] args) {
        //Créer une instance de GSON
        Gson gson = new GsonBuilder()
                .setFieldNamingStrategy(new MyFieldNamingStrategy())
                .create();

        //Convertir des objets Java en chaînes JSON
        String json = gson.toJson(new ExampleBean());

        //production
        System.out.println(json);
    }
}

MyFieldNamingStrategy.java


import com.google.gson.FieldNamingPolicy;
import com.google.gson.FieldNamingStrategy;
import java.lang.reflect.Field;

public class MyFieldNamingStrategy implements FieldNamingStrategy {

    @Override
    public String translateName(Field field) {
        //Des variables membres"_"Se débarrasser de
        String fieldName = FieldNamingPolicy.IDENTITY.translateName(field);
        if (fieldName.startsWith("_")) {
            fieldName = fieldName.substring(1);
        }
        return fieldName;
    }
}

ExampleBean.java


public class ExampleBean {
    //Au début des variables membres"_"Est attaché
    private String _firstField = "value";
    private String _secondField = "vaule";
}

Résultat d'exécution

//Au début des variables membres"_"Est pris
{"firstField":"value","secondField":"vaule"}

Il s'agit d'une scène dans laquelle un objet Java est converti en une chaîne JSON à l'aide de la bibliothèque Gson. Lorsque vous le regarderez à nouveau, vous serez ravi de l'interface qui semble à la fois simple et personnalisable.

Points d'appréciation

Gson est une bibliothèque open source créée par Google qui convertit les objets Java <=> JSON entre eux. J'utilise cette bibliothèque Gson pour convertir la classe ʻExampleBean` en JSON.

La classe ʻExampleBean` a probablement été écrite par un programmeur C ++ ou Objective-C. Inhabituel en Java, les variables membres sont préfixées par "\ _" (trait de soulignement). Cependant, je ne veux pas ajouter "\ _" au JSON généré cette fois.

Gson est conçu pour définir FieldNamingStrategy sur GsonBuilder comme logique pour déterminer le nom de champ (nom de clé JSON) lors de la conversion d'un objet Java en JSON. Dans le "Template Method pattern" que j'ai écrit dans l'article précédent, c'était un mécanisme pour hériter de la classe parente afin de personnaliser la fonction. Cette fois, j'ai défini une instance de la classe. Il semble y avoir une esthétique de conception en utilisant le moins possible l'héritage dans la personnalisation des fonctionnalités. Explorons ensemble.

Lorsque vous n'utilisez pas le modèle de stratégie

Le code au début utilise le modèle Strategy, mais pensons d'abord à ce à quoi ressemblerait le design sans le modèle Strategy, comme si vous étiez le concepteur de la bibliothèque Gson.

Ce que je veux faire, c'est ne pas ajouter "\ _" lors de la conversion d'une classe qui a "\ _" dans le nom du champ en JSON. On suppose qu'il existe de nombreuses classes à convertir et que les champs ne peuvent pas être renommés en refactorisant les classes.

Conception avec héritage

L'héritage de classe est la première chose dont nous parlons dans la programmation orientée objet, alors essayons de concevoir avec l'héritage. Implémentons la logique qui détermine le nom du champ en héritant de la classe Gson [^ 1].

MyGson.java


public class MyGson extends Gson {
    @Override
    protected String translateFieldName(Field field) {
        //Au début du nom du champ"_"Si est attaché, la chaîne de caractères supprimée est renvoyée.
        // "_"S'il n'y en a pas, renvoyez-le tel quel.
    }
}

Main.java


...
public class Main {

    public static void main(String[] args) {
        //Créer une instance de GSON
        Gson gson = new MyGson();

        //Convertir des objets Java en chaînes JSON
        String json = gson.toJson(new ExampleBean());

        //production
        System.out.println(json);
    }
}

C'est rafraîchissant que ce à quoi je m'attendais ... La classe MyGson implémente la logique pour traduire les noms de champs en remplaçant la méthode translateFieldName de la classe parent. La méthode surchargée est appelée à partir de la classe parent Gson lors de la création d'une chaîne JSON. Cette méthode est le "modèle de méthode de modèle" que j'ai écrit dans l'article précédent. C'est plus simple et plus facile à comprendre que vous ne pouvez l'imaginer.

Problèmes de conception avec héritage

Dans cette situation, vous ne pouvez pas vous empêcher de penser: "C'est une victoire écrasante pour le modèle de méthode de modèle. Je n'avais pas de modèle de stratégie."

Cependant, les noms de champs ne sont pas les seuls éléments que Gson peut personnaliser. En regardant Gson's Javadoc, il existe de nombreux autres points personnalisables en plus des noms de champs.

  1. setExclusionStrategy --Définissez les classes et les champs à ne pas inclure dans JSON
  2. setLongSerializationPolicy --Définit si le type Long est un nombre ou un nombre
  3. setDateFormat --Définit le format de conversion du type Date en chaîne

Etc.

Si vous effectuez toutes ces personnalisations avec l'héritage de classe parent, vous avez des problèmes. Autrement dit, la combinaison de fonctionnalités explosera.

Par exemple, supposons que vous utilisez une classe de Gson1 qui remplace la fonction de 1 ci-dessus, Gson2 qui remplace la fonction de 2 et Gson3 qui remplace la fonction de 3.

1 fonction 2 fonctions 3 caractéristiques
Classe Gson1
Classe Gson2
Classe Gson3

Dans cette situation, lorsque vous avez besoin des nouvelles fonctionnalités 1 et 2, vous aurez besoin d'une classe Gson12 qui remplace les deux méthodes. Le code source est dupliqué car le contenu de la méthode est exactement le même que celui décrit respectivement dans «Gson1» et «Gson2».

1 fonction 2 fonctions 3 caractéristiques
Classe Gson1
Classe Gson2
Classe Gson3
Classe Gson12

De plus, si vous avez besoin des fonctions 1 et 3, vous avez également besoin de la classe Gson13, et si vous avez besoin des fonctions 1, 2 et 3, vous devez créer la classe Gson123.

1 fonction 2 fonctions 3 caractéristiques
Classe Gson1
Classe Gson2
Classe Gson3
Classe Gson12
Classe Gson13
Classe Gson123
...

De cette façon, si vous essayez de le résoudre par ** héritage de la classe Gson, vous vous retrouverez avec la pire conception, où vous aurez besoin d'autant de classes qu'il y a de combinaisons de fonctions et le code source est dupliqué **.

En tant qu'autre méthode utilisant l'héritage, il est possible d'hériter de la classe ʻExampleBean qui se convertit en JSON et d'implémenter chaque méthode telle que translateFieldName` ici. Cependant, il rencontre toujours le même problème que ci-dessus, et cela va à l'encontre de la philosophie de spécification Gson de pouvoir convertir POJO (objet Java ordinaire) en JSON en premier lieu.

Lors de l'utilisation du modèle de stratégie

Maintenant, appliquons le modèle de stratégie. Veuillez revoir [le premier](# cet art) pour le code source et le résultat de l'exécution.

Le déroulement de ce modèle de stratégie est le suivant.

  1. GsonBuilder définit MyFieldNamingStrategy sur Gson
  2. MyFieldNamingStrategy # translateName est appelé lors de la traduction des noms de champs dans Gson # toJson

Le fait est que le processus de conversion des noms de champ est délégué à «MyFieldNamingStrategy» plutôt que directement dans la classe «Gson». En faisant cela, ** la classe principale (Gson) et la classe logique de conversion ( XXXStrategy) peuvent être séparées **. La séparation facilite le remplacement ou la réutilisation de la logique en un clin d'œil. beau!

La définition du GoF du modèle de stratégie est «Définir une famille d'algorithmes, encapsuler chacun d'eux et les rendre interchangeables. Le modèle de stratégie permet aux clients de modifier indépendamment les algorithmes qu'ils utilisent. [^ 2] ". La "famille d'algorithmes" correspond ici à des fonctions telles que la conversion des noms de champs (classe XXXStrategy).

Commentaires d'experts sur le modèle de stratégie

De nombreux experts ont également commenté l'évaluation du modèle de stratégie.

Hiroshi Yuki

Dans le modèle Stratégie, la partie qui implémente l'algorithme peut être échangée en un clin d'œil. Le modèle de stratégie est un modèle qui permet de changer facilement d'algorithme (stratégies, stratégies, stratégies) et de résoudre le même problème de différentes manières.

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

Quand il s'agit d'un algorithme quelque peu complexe, un programmeur normal découpera et agrégera cette partie. Il doit également être compatible au cas où il serait remplacé par un autre algorithme.

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

finalement

C'est le vrai plaisir d'un programmeur de pouvoir profiter d'un plaisir intellectuel rien qu'en regardant quelques lignes de code sans avoir à se rendre au musée.

Si vous êtes un ingénieur qui sympathise avec l'art du modèle de stratégie, veuillez contacter le responsable du recrutement de notre société (Qualysite Technologies Co., Ltd.). Contactez SVP!

Supplément (Conseils Gson)

Dans l'exemple ci-dessus, la classe FieldNamingStrategy a été utilisée pour convertir le nom du champ dans Gson, mais vous pouvez également déterminer le nom en JSON en annotant simplement les variables membres de la classe à convertir. Ceci est pratique lorsqu'il y a peu de classes à convertir.

ExampleBean.java


public class ExampleBean {
    @SerializedName("firstField")
    private String _firstField = "value";

    @SerializedName("secondField")
    private String _secondField = "vaule";
}

URL de référence

Article associé

Créer une instance

Simplifiez l'interface

Laissez-le à une autre classe

[^ 1]: La classe Gson est déclarée finale et ne peut pas être héritée. En supposant que vous êtes le concepteur de Gson, vous êtes en train de réfléchir au type de design que vous devriez créer. [^ 2]: ["Modèle de conception à réutiliser dans l'orientation objet"](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8 % E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3 % 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83 % 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3-% E3% 82% AC% E3% 83% B3% E3% 83% 9E-% E3% 82% A8% E3% 83% AA% E3% 83% 83% E3% 82% AF / dp / 479731126 / ref = sr_1_1? = 1495503419 & sr = 8-1 & mots-clés =% E3% 82% AA% E3% 83% 96% E3% 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3% 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% À partir de 91% E3% 82% BF% E3% 83% BC% E3% 83% B3)

Recommended Posts

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 constructeur
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 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é)
Stratégie sur la façon de monétiser avec Python Java
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
Résumé du chapitre 2 de l'introduction aux modèles de conception appris en langage 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