Menu
Coddy logo textTech

Patron Méthode modèle

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 97 sur 110.

Le patron Template Method définit le squelette d’un algorithme dans une classe de base, permettant aux sous-classes de remplacer des étapes spécifiques sans modifier la structure globale. La classe de base contrôle le flux de travail, tandis que les sous-classes personnalisent les étapes individuelles.

Ce modèle utilise l’héritage : une classe abstraite définit une méthode modèle qui appelle une séquence d’étapes, dont certaines sont abstraites (elles doivent être implémentées par les sous-classes) et dont certaines disposent d’implémentations par défaut :

abstract class DataProcessor {
  // Méthode template - définit la structure de l'algorithme
  void process() {
    readData();
    processData();
    saveData();
  }

  void readData();      // Abstrait - les sous-classes doivent implémenter
  void processData();   // Abstrait - les sous-classes doivent implémenter

  void saveData() {     // Implémentation par défaut
    print('Data saved to database');
  }
}

class CsvProcessor extends DataProcessor {
  @override
  void readData() => print('Reading CSV file');

  @override
  void processData() => print('Parsing CSV rows');
}

class JsonProcessor extends DataProcessor {
  @override
  void readData() => print('Reading JSON file');

  @override
  void processData() => print('Parsing JSON objects');

  @override
  void saveData() => print('Saved to cloud storage');
}

void main() {
  var csv = CsvProcessor();
  csv.process();
  // Lecture du fichier CSV
  // Analyse des lignes CSV
  // Données enregistrées dans la base de données

  var json = JsonProcessor();
  json.process();
  // Lecture du fichier JSON
  // Analyse des objets JSON
  // Enregistré dans le stockage cloud
}

La méthode process() est le modèle : elle définit l’ordre des opérations. Les sous-classes implémentent readData() et processData() différemment, et peuvent éventuellement redéfinir saveData(). L’avantage principal est que la structure de l’algorithme reste cohérente dans toutes les implémentations, tout en permettant une certaine flexibilité dans les étapes individuelles.

challenge icon

Défi

Facile

Construisons un système de génération de rapports en utilisant le patron Template Method ! Vous allez créer un framework dans lequel différents types de rapports suivent la même structure générale, mais où chaque type de rapport personnalise certaines étapes, comme la collecte des données et la mise en forme du résultat.

Vous allez organiser votre code en deux fichiers :

  • report_generator.dart : ce fichier contient votre classe de base abstraite et les implémentations concrètes des rapports. Créez une classe de base abstraite ReportGenerator avec une méthode modèle appelée generate() qui définit le workflow de génération du rapport dans cet ordre : fetchData(), analyzeData(), formatReport() et deliver(). Les méthodes fetchData() et formatReport() doivent être abstraites (chaque type de rapport les gère différemment), tandis que analyzeData() doit afficher Analyzing data... et deliver() doit afficher Report delivered via email. en tant qu’implémentations par défaut. Créez ensuite deux classes concrètes de rapports :
    • SalesReport - sa méthode fetchData() affiche Fetching sales data from database... et sa méthode formatReport() affiche Formatting as bar charts and tables.
    • InventoryReport - sa méthode fetchData() affiche Fetching inventory levels from warehouse..., sa méthode formatReport() affiche Formatting as inventory list., et elle remplace deliver() pour afficher Report sent to warehouse manager.
  • main.dart : importez votre fichier de génération de rapports et montrez comment le patron Template Method conserve une structure d’algorithme cohérente tout en permettant la personnalisation. Créez un SalesReport et appelez sa méthode generate(). Affichez ensuite une ligne vide pour séparer les résultats. Créez un InventoryReport et appelez également sa méthode generate().

Remarquez que les deux rapports suivent le même processus en quatre étapes, mais que chacun personnalise les étapes importantes pour son objectif spécifique. L’InventoryReport remplace même la méthode de livraison par défaut afin d’envoyer les rapports à un autre destinataire !

Résultat attendu :

Fetching sales data from database...
Analyzing data...
Formatting as bar charts and tables.
Report delivered via email.

Fetching inventory levels from warehouse...
Analyzing data...
Formatting as inventory list.
Report sent to warehouse manager.

Essayez vous-même

import 'report_generator.dart';

void main() {
  // TODO: Créer un SalesReport et appeler sa méthode generate()

  // TODO: Afficher une ligne vide pour la séparation

  // TODO: Créer un InventoryReport et appeler sa méthode generate()
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Dart en ligne