Examen en ingénierie avancée de l'objet - design patterns -

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>



FAQ

Quels sont les design patterns recommandés pour cette application ?

Les design patterns Factory Method, Composite et Abstract Factory sont les plus adaptés pour gérer la création dynamique et la structure des vélos.

Pourquoi utiliser une classe abstraite pour les éléments ?

Une classe abstraite Element permet de définir une interface commune pour tous les composants (roues, selle, cadre, etc.) tout en laissant chaque sous-classe implémenter ses propres détails.

Comment gérer les éléments optionnels dans le vélo ?

Les éléments optionnels (comme garde-boue ou porte-bagage) peuvent être ajoutés dynamiquement via la méthode ajouterÉlément de la classe Vélo.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne