Exercice : Recette de cuisine avec les motifs de conception Composite et Decorator
Préparation des classes de base
Écrire une classe Met avec les méthodes suivantes :
- toString() : renvoie le nom du met et ses informations.
- estSucre() : indique si le met est sucré.
- estSale() : indique si le met est salé.
- estSucreSale() : indique si le met est à la fois sucré et salé.
- nombreDeCalories() : retourne le nombre de calories du met.
- si c'estDietetique() : vérifie si le met est diététique (nombre de calories inférieur à 200).
Héritage des ingrédients
Créer les classes suivantes qui héritent de Met :
- Sucre
- Sel
- Poire
- Pomme
- Framboise
- Veau
- Bœuf
- Chocolat
- Carotte
- Haricot_vert
Motif de conception Composite
Représenter un plat composé (comme un bœuf-carotte ou une poire belle Hélène) tout en le considérant comme un met individuel. Dans ce cas, la méthode toString() doit afficher la liste des ingrédients du plat composé.
Un met est :
- sucré si au moins un de ses ingrédients est sucré.
- salé si au moins un de ses ingrédients est salé.
- sucré-salé s'il est à la fois sucré et salé.
Utiliser java.util.ArrayList pour gérer les listes d'ingrédients.
Créer des recettes personnalisées en combinant des mets simples ou composés, et en utilisant plusieurs fois le même ingrédient dans un programme de test.
Motif de conception Decorator
Introduire une nouvelle catégorie de mets : les mets allégés, qui sont systématiquement diététiques. Cette modification ne doit pas altérer les classes existantes, mais en créer de nouvelles.
La classe décorateur doit :
- Hériter de la classe à décorer et inclure une instance de cette classe dans son constructeur.
- Redéfinir certaines méthodes (comme estDietetique()) pour adapter le comportement.
- Modifier les méthodes d'affichage pour embellir le résultat (exemple : ajouter "allégé" au nom du met).
Exemple de mise en œuvre
Voici une structure possible pour implémenter ces motifs :
- La classe Met définit les méthodes communes à tous les mets.
- Les classes d'ingrédients (comme Poire, Bœuf) implémentent Met avec leurs propriétés spécifiques.
- La classe MetCompose (pour Composite) étend Met et contient une liste d'ingrédients.
- La classe MetAllerge (pour Decorator) étend Met et prend un met existant en paramètre pour le modifier.
FAQ
1. Comment gérer les recettes imbriquées avec le motif Composite ?
Utiliser une liste d'ingrédients de type ArrayList dans la classe MetCompose. Chaque ingrédient peut être un objet simple (Poire, Bœuf) ou un autre objet composé (MetCompose).
2. Pourquoi le motif Decorator est-il utile ici ?
Il permet d'ajouter dynamiquement la propriété "allégé" sans modifier les classes existantes, en respectant le principe d'ouverture/fermeture (Open/Closed Principle).
3. Comment implémenter la méthode estSucreSale() dans un met composé ?
Vérifier si le met est à la fois sucré (estSucre()) et salé (estSale()) en parcourant ses ingrédients. Si au moins un ingrédient est sucré ET un autre est salé, la méthode retourne true.