Menu
Coddy logo textTech

Patron Décorateur

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

Le patron Décorateur vous permet d'ajouter dynamiquement de nouveaux comportements à des objets en les enveloppant dans des objets spéciaux appelés décorateurs. Contrairement à l'héritage, qui ajoute du comportement au moment de la compilation, les décorateurs attachent des responsabilités supplémentaires au moment de l'exécution sans modifier la classe d'origine.

L’idée clé est que l’objet d’origine et les décorateurs implémentent la même interface.

Un décorateur enveloppe l'objet original, lui délègue des tâches et ajoute son propre comportement avant ou après :

abstract class Coffee {
  String getDescription();
  double getCost();
}

class SimpleCoffee implements Coffee {
  @override
  String getDescription() => 'Simple Coffee';

  @override
  double getCost() => 2.0;
}

class MilkDecorator implements Coffee {
  final Coffee _coffee;
  MilkDecorator(this._coffee);

  @override
  String getDescription() => '${_coffee.getDescription()}, Milk';

  @override
  double getCost() => _coffee.getCost() + 0.5;
}

class SugarDecorator implements Coffee {
  final Coffee _coffee;
  SugarDecorator(this._coffee);

  @override
  String getDescription() => '${_coffee.getDescription()}, Sugar';

  @override
  double getCost() => _coffee.getCost() + 0.2;
}

void main() {
  Coffee coffee = SimpleCoffee();
  coffee = MilkDecorator(coffee);
  coffee = SugarDecorator(coffee);

  print(coffee.getDescription());  // Simple Coffee, Milk, Sugar
  print(coffee.getCost());         // 2.7
}

Chaque décorateur enveloppe l'objet précédent et l'améliore. Vous pouvez empiler plusieurs décorateurs dans n'importe quelle combinaison, créant ainsi un comportement flexible sans avoir à créer une sous-classe pour chaque combinaison possible. Ce patron est idéal lorsque vous devez ajouter des fonctionnalités à des objets sans affecter les autres objets de la même classe.

challenge icon

Défi

Facile

Construisons un système de commande de pizzas en utilisant le patron Decorator ! Vous allez créer une pizza de base qui peut être enrichie avec différentes garnitures, chaque garniture enveloppant l’élément précédent et ajoutant à la fois à la description et au prix.

Vous allez organiser votre code en deux fichiers :

  • pizza.dart : ce fichier contient votre interface de pizza et toutes les classes décoratrices. Commencez par une classe abstraite Pizza qui définit deux méthodes : String getDescription() et double getPrice(). Créez ensuite une classe PlainPizza qui implémente Pizza — elle renvoie Plain Pizza comme description et coûte 8.0. Construisez maintenant trois classes décoratrices qui enveloppent chacune une Pizza et l’enrichissent :
    • CheeseDecorator — ajoute , Cheese à la description et 1.5 au prix
    • PepperoniDecorator — ajoute , Pepperoni à la description et 2.0 au prix
    • MushroomDecorator — ajoute , Mushrooms à la description et 1.25 au prix
    Chaque décorateur doit implémenter Pizza, accepter une Pizza dans son constructeur et déléguer à la pizza enveloppée avant d’ajouter sa propre contribution.
  • main.dart : importez votre fichier de pizza et montrez comment les décorateurs s’empilent pour créer une commande personnalisée. Commencez par une PlainPizza, enveloppez-la ensuite avec CheeseDecorator, puis enveloppez le tout avec PepperoniDecorator, et enfin enveloppez l’ensemble avec MushroomDecorator. Affichez la description finale de la pizza, puis affichez Total: $ suivi du prix.

Remarquez comment chaque décorateur s’appuie sur le précédent — vous créez une pizza entièrement garnie en empilant des décorateurs simples, chacun ayant une seule responsabilité !

Résultat attendu :

Plain Pizza, Cheese, Pepperoni, Mushrooms
Total: $12.75

Essayez vous-même

import 'pizza.dart';

void main() {
  // TODO: Créer une PlainPizza
  
  // TODO: L'envelopper avec CheeseDecorator
  
  // TODO: Envelopper cela avec PepperoniDecorator
  
  // TODO: Tout envelopper avec MushroomDecorator
  
  // TODO: Afficher la description finale de la pizza
  
  // TODO: Afficher "Total: $" suivi du prix
}
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