feat: modification et deplacement des decorateurs

This commit is contained in:
2025-12-18 14:44:44 +01:00
parent a5d03178d9
commit 5fdd043e57
5 changed files with 108 additions and 166 deletions

View File

@@ -346,3 +346,111 @@ public class Car {
return NAME; 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;
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}