Exercice: Une agence de location (
rental agency en anglais) de voitures (car) offre à ses clients la possibilité de choisir
voiture louée en fonction de différents critères. Les voitures sont définies par une marque (
brand), un nom
de modèle (
model), une année de production (
production year) et un prix de location à la journée (
daily rental
price). Pour simplifier les deux premiers paramètres seront des objets de la classe
String, le troisième sera de
type
int et le dernier de type
double. Deux voitures sont considérées égales si tous leurs attributs sont égaux.
La classe
Car contiendra donc les propriétés suivantes :
- String brand
- String model
- int productionYear
- double dailyRentalPrice
Elle contiendra aussi le constructeur :
- public Car(String brand, String model, int productionYear, int dailyrentalPrice)
ainsi que les méthodes :
- public String brand()
- public String model()
- public int productionYear()
- public double dailyRentalprice()
- public boolean equals(o : Object)
- public String toString()
La classe
RentalAgency contiendra une propriété
List<Car> cars, un constructeur
public RentalAgency() ainsi que les méthodes suivantes (pour le moment) :
- public void add(Car car)
- public void remove(Car car)
- public boolean contains(Car car).
On souhaite pouvoir sélectionner parmi les voitures à louer toutes les voitures satisfaisant un critère
(
criterion) donné. Programmez une méthode
selectByBrand dans la classe
RentalAgency dont le
résultat est la liste des véhicules de l’agence dont la marque est la même que celle passée en paramètre
de la méthode.
- -
- -
- -
- De la même façon programmez une méthode selectByMaxPrice de la classe RentalAgency dont le
résultat est la liste des véhicules dont le prix de location à la journée est inférieure au prix passé en
paramètre de la méthode. - Comparez ces deux méthodes, qu’en pensez-vous ? Imaginez d’autres critères pouvant être sélectionnés.
- On veut maintenant définir la notion de critère de sélection pour les voitures. Un critère peut être satisfait
par une voiture, cela signifie que le critère filtre (ou sélectionne) cette voiture. Définir une interface dans
le but (futur) de généraliser les deux méthodes. - On pourrait imaginer d’autres applications, où l’on veut filtrer des appartements, des ordinateurs, . . .
Modifier l’interface pour la rendre générique. Cette interface existe en Java sous le nom Predicate<T>. - Programmez une classe MaxPriceCriterion. Les instances de cette classe sont des critères imposant un
prix maximum sur les voitures. Cette classe doit passer avec succès le test suivant :
1 2 3 4 5 6 7 8 9 10
| public class MaxPriceCriterionTest {
@Test
public void testIsSatisfied() {
Predicate<Car> cheap = new MaxPriceCriterion(100);
Car c90 = new Car("Tim","Oleon",2015,90);
Car c120 = new Car("Tim","Oleon",2016,120);
assertTrue(cheap.test(c90));
assertFalse(cheap.test(c120));
}
} |
Ajoutez une méthode select dans la classe RentalAgency qui corresponde à :
1 2 3 4 5 6 7 8
| /**
* return the list of cars of this agency that satisfy the specified
* {@code criterion}. The returned cars are then << filtered >> by the criterion.
*
* @param criterion the criterion that the selected cars must satisfy
* @return the list of cars of this agency that satisfy the given criterion
*/
public List<Car> select(Predicate<Car> criterion) |
En supposant que RentalAgency agency a été initialisée, quelles instructions permettent d’afficher
toutes les voitures de cette agence dont le prix est inférieur à 100 ? - -
- On peut naturellement souhaiter faire des intersections de critères, ce qui revient à appliquer le et
logique entre les critères. On obtient alors un nouveau critère qui est satisfait lorsque tous les critères qui
le composent sont satisfaits. Définissez une classe InterCriterion qui permet de définir des critères par
intersection de plusieurs critères. On donnera un constructeur prenant deux critères, et un constructeur
prenant une collection de critères. - Comment afficher maintenant toutes les voitures de marque “Tim” et de prix inférieur à 100 ?
Ecrire une classe test pour tester toutes les méthodes
Partager