Examen en Design Patterns – Ingénierie Avancée de l’Objet (2012/2013)
Problème : Application Web de Gestion de Vente de Vélos
L’objectif de ce problème est de concevoir une application web de gestion de vente de vélos en s’appuyant sur les design patterns de création et de structure.
Un revendeur de vélos souhaite proposer des vélos avec diverses caractéristiques.
Caractéristiques des Vélos
Un vélo possède :
- Un type (route, VTT, fitness)
- Un prix
- Un poids
- Une taille
- Un genre (homme ou femme)
- Une marque
Un vélo est composé de plusieurs éléments : roues, selle, cadre, pédales, freins, guidon, garde-boue, porte-bagage, lumière, qui partagent les mêmes caractéristiques (prix et poids). Tous ces éléments, y compris le vélo, héritent d’une classe abstraite appelée Element.
La classe Vélo est une classe abstraite, et les classes concrètes correspondent aux différents types de vélos.
Partie 1 : Création Dynamique de Vélos
On souhaite récupérer dynamiquement des instances de vélos selon le(s) paramètre(s) fourni(s) dans la classe cliente.
1. Diagramme de Classes
Les design patterns à utiliser incluent :
- Factory Method : Pour créer les différentes instances de vélos (Route, VTT, Fitness) sans spécifier explicitement leur classe.
- Composite : Pour modéliser la hiérarchie des éléments composant un vélo.
- Abstract Factory : Pour fournir une interface permettant de créer des familles d’éléments compatibles (ex : roues, selle, etc.).
2. Code Correspondant
Exemple de création et d’affichage d’un vélo de type Route :
<!DOCTYPE html>
<html>
<head>
<title>Exemple de Code Java – Design Patterns Vélos</title>
</head>
<body>
<h3>Classe abstraite Element</h3>
<pre>
public abstract class Element {
protected double prix;
protected double poids;
public Element(double prix, double poids) {
this.prix = prix;
this.poids = poids;
}
public abstract String afficher();
public abstract double calculerPoids();
public abstract double calculerPrix();
}
</pre>
<h3>Classe abstraite Vélo</h3>
<pre>
public abstract class Vélo extends Element {
protected String type;
protected String genre;
protected String marque;
protected List<Element> éléments;
public Vélo(String type, String genre, String marque, double prix, double poids) {
super(prix, poids);
this.type = type;
this.genre = genre;
this.marque = marque;
this.éléments = new ArrayList<>();
}
public abstract void ajouterÉlément(Element élément);
public abstract String afficher();
}
</pre>
<h3>Classe concrète Roue</h3>
<pre>
public class Roue extends Element {
public Roue(double prix, double poids) {
super(prix, poids);
}
@Override
public String afficher() {
return "Roue : Prix = " + prix + " DH, Poids = " + poids + " g";
}
@Override
public double calculerPoids() {
return poids;
}
@Override
public double calculerPrix() {
return prix;
}
}
</pre>
<h3>Classe concrète RouteVélo</h3>
<pre>
public class RouteVélo extends Vélo {
public RouteVélo(String genre, String marque) {
super("Route", genre, marque, 0, 0);
}
@Override
public void ajouterÉlément(Element élément) {
éléments.add(élément);
}
@Override
public String afficher() {
StringBuilder sb = new StringBuilder();
sb.append("Vélo de type ").append(type).append(", Genre : ").append(genre)
.append(", Marque : ").append(marque).append("\n");
sb.append("Poids total : ").append(calculerPoids()).append(" g\n");
sb.append("Prix total : ").append(calculerPrix()).append(" DH\n");
sb.append("Composants :\n");
for (Element élément : éléments) {
sb.append(élément.afficher()).append("\n");
}
return sb.toString();
}
@Override
public double calculerPoids() {
double poidsTotal = super.poids;
for (Element élément : éléments) {
poidsTotal += élément.calculerPoids();
}
return poidsTotal;
}
@Override
public double calculerPrix() {
double prixTotal = super.prix;
for (Element élément : éléments) {
prixTotal += élément.calculerPrix();
}
return prixTotal;
}
}
</pre>
<h3>Exemple de Création et Affichage</h3>
<pre>
public class Client {
public static void main(String[] args) {
RouteVélo véloRoute = new RouteVélo("homme", "Redford");
véloRoute.ajouterÉlément(new Roue(200, 250));
véloRoute.ajouterÉlément(new Roue(200, 250));
véloRoute.ajouterÉlément(new Selle(250, 500));
véloRoute.ajouterÉlément(new Cadre(500, 500, "Redford"));
véloRoute.ajouterÉlément(new Pédale(100, 100));
véloRoute.ajouterÉlément(new Pédale(100, 100));
véloRoute.ajouterÉlément(new Frein(150, 50));
véloRoute.ajouterÉlément(new Frein(150, 50));
véloRoute.ajouterÉlément(new Guidon(250, 200));
véloRoute.ajouterÉlément(new Lumière(50, 50));
véloRoute.ajouterÉlément(new Lumière(50, 50));
véloRoute.ajouterÉlément(new GardeBoue(50, 50));
véloRoute.ajouterÉlément(new PorteBagage(150, 50));
System.out.println(véloRoute.afficher());
}
}
</pre>