Maîtriser le Patron de Conception Méthode Modèle en Java

Concept Fondamental

Le patron de méthode modèle (Template Method Pattern) est un patron de conception comportemental. Il consiste à définir le squelette d'un algorithme au sein d'une classe de base, tout en laissant le soin aux sous-classes de redéfinir certaines étapes spécifiques sans en modifier la structure globale.

Ce pattern est particulièrement utile pour éliminer la duplication de code et pour appliquer le princpie d'inversion de contrôle, souvent illustré par le principe de Hollywood : « Ne nous appelez pas, c'est nous qui vous appellerons ».

Illustration par l'Exemple

Pour démontrer ce concept, analysons le cas d'un pipeline d'exportation de données. Le processus global (connexion, extraction, transformation, validation optionnelle et chargement) reste strictement identique, mais les détails d'implémentation de chaque étape varient selon le format de sortie cible, comme CSV ou JSON.

Déclaration de la Classe Abstraite

La classe de base définit la méthode modèle comme final pour empêcher les sous-classes d'en altérer l'ordre d'exécution. Elle inclut également une méthode « crochet » (hook) permettant de gérer des étapes conditionnelles de manière optionnelle.

public abstract class DataExportPipeline {
    
    // Méthode modèle : le squelette de l'algorithme
    public final void executeExport() {
        connectToDataSource();
        extractData();
        transformData();
        
        // Utilisation de la méthode crochet pour une étape conditionnelle
        if (requiresValidation()) {
            validateData();
        }
        
        loadData();
    }
    
    protected void connectToDataSource() {
        System.out.println("Connexion à la source de données...");
    }
    
    // Étapes à implémenter obligatoirement par les sous-classes
    protected abstract void extractData();
    
    protected abstract void transformData();
    
    // Méthode crochet : comportement par défaut, peut être redéfinie
    protected boolean requiresValidation() {
        return false;
    }
    
    protected void validateData() {
        System.out.println("Validation de l'intégrité des données...");
    }
    
    protected abstract void loadData();
}

Implémentation des Sous-classes

Les classes concrètes héritent de la classe abstraite et fournissent leur propre logique pour les étapes abstraites. Elles peuvent également choisir de redéfinir la méthode crochet pour activer des fonctionnalités supplémentaires.

public class CsvDataExporter extends DataExportPipeline {
    
    @Override
    protected void extractData() {
        System.out.println("Extraction des données brutes pour le format CSV...");
    }
    
    @Override
    protected void transformData() {
        System.out.println("Transformation et formatage en CSV...");
    }
    
    @Override
    protected boolean requiresValidation() {
        return true; // Activation de la validation pour le CSV
    }
    
    @Override
    protected void loadData() {
        System.out.println("Écriture du fichier CSV sur le disque local...");
    }
}
public class JsonDataExporter extends DataExportPipeline {
    
    @Override
    protected void extractData() {
        System.out.println("Extraction des données brutes pour le format JSON...");
    }
    
    @Override
    protected void transformData() {
        System.out.println("Sérialisation des objets en JSON...");
    }
    
    // La méthode requiresValidation() n'est pas redéfinie, 
    // elle conserve sa valeur par défaut (false).
    
    @Override
    protected void loadData() {
        System.out.println("Envoi du flux JSON vers l'API distante...");
    }
}

Exécution et Vérification

Le point d'entrée instancie les différents exporteurs et déclenche le processus via la méthode modèle.

public class ExportPipelineDemo {
    
    public static void main(String[] args) {
        System.out.println("--- Début de l'exportation CSV ---");
        DataExportPipeline csvExporter = new CsvDataExporter();
        csvExporter.executeExport();
        
        System.out.println("\n--- Début de l'exportation JSON ---");
        DataExportPipeline jsonExporter = new JsonDataExporter();
        jsonExporter.executeExport();
    }
}

Résultat d'Exécution

--- Début de l'exportation CSV ---
Connexion à la source de données...
Extraction des données brutes pour le format CSV...
Transformation et formatage en CSV...
Validation de l'intégrité des données...
Écriture du fichier CSV sur le disque local...

--- Début de l'exportation JSON ---
Connexion à la source de données...
Extraction des données brutes pour le format JSON...
Sérialisation des objets en JSON...
Envoi du flux JSON vers l'API distante...

Étiquettes: Java template-method-pattern design-patterns object-oriented-programming behavioral-pattern

Publié le 8 juillet à 05h04