diff --git a/src/Car.java b/src/Car.java index 7beb30d..260c82a 100644 --- a/src/Car.java +++ b/src/Car.java @@ -346,3 +346,111 @@ public class Car { return NAME; } } + +/** + * DrunkCar = décorateur "pilote ivre". + * + * Idée : + * - Quand l'utilisateur demande "Accelerer", le pilote peut se tromper + * et faire "Rallentir" à la place (au hasard). + * - Pareil quand on demande "Rallentir". + * + * => On modifie seulement les actions utilisateur (accelerate/decelerate), + * sans modifier la classe Car. + */ +class DrunkCar extends Car { + private Car car; + + public DrunkCar(Car car) { + super(car); + this.car = car; + + } + + // 50% : fait la bonne action, + // 50% : fait l'inverse + private void mayReverse() { + if (RANDOM.nextBoolean()) { + car.reverse(); + } + } + + @Override + public void move() { + mayReverse(); + super.move(); + } +} + +/** + * Décorateur Sound : + * affiche un message sonore quand la voiture accélère. + */ +class SoundCar extends Car { + private Car car; + + public SoundCar(Car car) { + super(car); + this.car = car; + } + + @Override + public String accelerate() { + System.out.println("VROOOOM VROOOOOOM"); + return car.accelerate(); + } +} + +/** + * HybridCar = décorateur "voiture hybride". + * + * Idée : + * - La voiture avance à chaque tour + * - Mais elle consomme du carburant seulement 1 fois sur 2 + * => donc elle économise du carburant. + */ +class HybridCar extends Car { + private Car car; + private int energy = 100; // énergie batterie (0..100) + + public HybridCar(Car car) { + super(car); + this.car = car; + } + + /** pour afficher l'énergie dans le Dashboard */ + public int getEnergy() { + return energy; + } + + @Override + public void run() { + // 1) La voiture avance toujours + car.move(); + + // 2) Gestion énergie : elle perd 10% à chaque boucle + energy -= 10; + if (energy < 0) + energy = 0; + + // 3) Consommation : + // - si on a encore de l'énergie, on économise le fuel (pas de conso) + // - sinon, on consomme normalement + if (energy == 0) { + car.consumeFuel(); + } + } + + @Override + public String decelerate() { + // 1) On applique le ralentissement normal (State pattern) + String msg = car.decelerate(); + + // 2) Recharge +5% quand on ralentit + energy += 5; + if (energy > 100) + energy = 100; + + return msg; + } +} diff --git a/src/CarDecorator.java b/src/CarDecorator.java deleted file mode 100644 index 7cc6371..0000000 --- a/src/CarDecorator.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Décorateur abstrait pour une voiture. - * - * Il encapsule une voiture existante et délègue - * toutes les actions à celle-ci. - * - * Pattern Decorator : on ajoute un comportement - * sans modifier la classe Car. - */ -public abstract class CarDecorator { - - protected final Car car; - - public CarDecorator(Car car) { - this.car = car; - } - - // --- Délégation --- - - public void run() { - car.run(); - } - - public int getFuel() { - return car.getFuel(); - } - - public int getRound() { - return car.getRound(); - } - - public int getScore() { - return car.getScore(); - } - - public int getPos() { - return car.getPos(); - } - - public Car.State getState() { - return car.getState(); - } - - public String accelerate() { - return car.accelerate(); - } - - public String decelerate() { - return car.decelerate(); - } - - public String getName() { - return car.getName(); - } - - public java.awt.Color getColor() { - return car.getColor(); - } -} diff --git a/src/DrunkCar.java b/src/DrunkCar.java deleted file mode 100644 index 85577db..0000000 --- a/src/DrunkCar.java +++ /dev/null @@ -1,40 +0,0 @@ -import java.util.Random; - -/** - * DrunkCar = décorateur "pilote ivre". - * - * Idée : - * - Quand l'utilisateur demande "Accelerer", le pilote peut se tromper - * et faire "Rallentir" à la place (au hasard). - * - Pareil quand on demande "Rallentir". - * - * => On modifie seulement les actions utilisateur (accelerate/decelerate), - * sans modifier la classe Car. - */ -public class DrunkCar extends CarDecorator { - - private static final Random RANDOM = new Random(); - - public DrunkCar(Car car) { - super(car); - } - // 50% : fait la bonne action, 50% : fait l'inverse - - @Override - public String accelerate() { - if (RANDOM.nextBoolean()) { - return car.accelerate(); - } else { - return car.decelerate(); - } - } - - @Override - public String decelerate() { - if (RANDOM.nextBoolean()) { - return car.decelerate(); - } else { - return car.accelerate(); - } - } -} diff --git a/src/HybridCar.java b/src/HybridCar.java deleted file mode 100644 index 7f1cfb5..0000000 --- a/src/HybridCar.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * HybridCar = décorateur "voiture hybride". - * - * Idée : - * - La voiture avance à chaque tour - * - Mais elle consomme du carburant seulement 1 fois sur 2 - * => donc elle économise du carburant. - */ -public class HybridCar extends CarDecorator { - - private int energy = 100; // énergie batterie (0..100) - - public HybridCar(Car car) { - super(car); - } - /** pour afficher l'énergie dans le Dashboard */ - public int getEnergy() { - return energy; - } - - - @Override - public void run() { - // 1) La voiture avance toujours - car.move(); - - // 2) Gestion énergie : elle perd 10% à chaque boucle - energy -= 10; - if (energy < 0) energy = 0; - - // 3) Consommation : - // - si on a encore de l'énergie, on économise le fuel (pas de conso) - // - sinon, on consomme normalement - if (energy == 0) { - car.consumeFuel(); - } - } - - @Override - public String decelerate() { - // 1) On applique le ralentissement normal (State pattern) - String msg = car.decelerate(); - - // 2) Recharge +5% quand on ralentit - energy += 5; - if (energy > 100) energy = 100; - - return msg; - } -} - diff --git a/src/SoundCar.java b/src/SoundCar.java deleted file mode 100644 index f1f2bf3..0000000 --- a/src/SoundCar.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Décorateur Sound : - * affiche un message sonore quand la voiture accélère. - */ -public class SoundCar extends CarDecorator { - public SoundCar(Car car) { - super(car); - } - - @Override - public String accelerate() { - String msg = car.accelerate(); - System.out.println("VROOOOM VROOOOOOM"); - return msg; - } -}