Consor um Interna onal e-Miage Contrôle terminal Session de décembre 2021 Nombre de pages : 3 Durée de l’épreuve : 2 heures Code du Module : C240 In tulé du module : POO Avancée Nom de l’enseignant : F. Fürst Les documents papier sont autorisés. [ Exercice 1 (6 points) : on veut développer un logiciel pour gérer des médicaments. Deux interfaces ont déjà écrites (ci-dessous) pour représenter les molécules composant les médicaments et les pa ents. public interface Molecule{ public String getNom(); public String getFormule(); } public interface Pa ent{ public float getPoids(); public int getAge(); } Les médicaments peuvent être composés d’une molécule ou de plusieurs. S’ils sont composés d’une seule molécule, ils portent le nom de ce e molécule, sinon ils ont une dénomina on commune interna onale (DSI) donnée par l’OMS (Organisa on Mondiale de la Santé). Parmi les médicaments, certains sont génériques (aucun brevet n’empêche de les fabriquer) et d’autres non génériques. Les médicaments non génériques ont, en plus de la DSI, un nom commercial, donné par l’entreprise qui les fabrique. Pour chaque médicament, il faut pouvoir calculer la dose à fournir pour un pa ent, en fonc on de son âge et de son poids. En respectant au mieux les principes de la POO, écrivez du code perme ant de représenter les médicaments dans le logiciel. Exercice 2 (6 points) : Le patron de concep on Proxy vise à masquer un objet à un autre objet qui l’u lise. Sur le diagramme suivant, l’objet client Customer va u liser RealSubject indirectement, en n’appelant que les méthodes d’un objet Proxy qui fait écran. L’objet Proxy u lise un objet RealSubject qui implémente réellement l’interface Subject, alors que le Proxy ne fait qu’appeler la méthode opera on du RealSubject après un prétraitement. 1 Plusieurs raisons peuvent rendre le patron Proxy u le. L’objet Proxy peut ainsi réaliser divers traitements avant de lancer l’opéra on opera on(). Par exemple, si le RealSubject est un programme qui donne accès à des pages Web, le Proxy peut contrôler que les pages demandées ne sont pas bannies d’accès. Dans cet exercice, on veut écrire un logiciel de ges on de fichier archive (du genre tar ou zip), qui offrira plusieurs méthodes d’archivage. Il est nécessaire d’u liser l’interface suivante pour représenter les différentes méthodes : import java.io.File; public interface Archivage{ /** return true si la décompression de l'archive dans le répertoire se passe bien, faux sinon un échec peut venir d’un manque d'espace disque, de la présence d’un virus dans l’archive, etc */ public boolean decompresse(File archive, File repertoire); /** return true si la compression des fichiers dans l'archive réussit, faux sinon un échec peut venir d’un manque d'espace disque, de fichiers contenant un virus, etc */ public boolean compresse(File[] fichiers, File archive); } Avant toute compression, il faut vérifier que les fichiers à archiver ne con ennent aucun virus. Avant toute décompression, il faut vérifier que l’archive à décomprimer ne con ent pas de virus. Différents programmes an virus sont disponibles, qui respectent tous l’interface suivante : import java.io.File; public interface An virus{ /** renvoie null si le fichier f ne con ent aucun virus ou un rapport textuel sinon */ public String scanne(File f); } D’autre part, on veut pouvoir changer d’an virus au cours de l’u lisa on du programme d’archivage. U lisez le patron Proxy pour écrire le code correspondant, et d’autres patrons si vous le jugez u le en expliquant la structura on de votre code avec un schéma UML. Exercice 3 (8 points) : le patron de concep on Chain of Responsability permet de lier de façon modulaire et évolu ve des objets réalisant des traitements semblables ou complétaires. Sur le schéma suivant, la classe Handler offre une méthode opera on qui correspond à un traitement générique. Chaque Handler a un a ribut qui pointe vers le Handler suivant et redéfinit la méthode opera on. En cas d’appel de la méthode opera on d’un ConcreteHandler, le ConcreteHandler réalise le traitement s’il peut le faire, sinon, il fait appel au Handler suivant. La chaine de responsabilité est cons tuée par tous les Handler qui sont créés et chainés. 2 Voici deux classes qui offrent des méthodes d’affichage de la date courante selon le calendrier grégorien et selon le calendrier romain qui commence à la fonda on de Rome (753 avant JC). public class AfficheurGregorien{ public void afficheDate(){ Calendar cal = Calendar.getInstance(); // on récupère la date courante System.out.println(cal.get(Calendar.DAY_OF_MONTH)+"/"+ cal.get(Calendar.MONTH)+"/"+cal.get(Calendar.YEAR)); } } public class AfficheurRomain{ private String[] mois = {"Ianuarius","Februarius","Mar us","Aprilis", "Maius","Iunius","Quin lis","Sex lis","September","October", "November","December"}; public void affiche(int format){ Calendar cal = Calendar.getInstance(); // on récupère la date courante System.out.println(cal.get(Calendar.DAY_OF_MONTH)+" "+ mois[cal.get(Calendar.MONTH)]+" "+(cal.get(Calendar.YEAR)+753)); } } 3.1 Proposez du code objet correspondant au patron Chain of Responsability et perme ant de faire afficher la date selon un format donné. (5 points) 3.2 On veut pouvoir u liser la chaine des objets affichant la date sans se soucier de la façon dont ce e chaine doit être créée. Expliquez quel(s) patron(s) sont indiqués pour résoudre ce problème et écrivez le code correspondant. (3 points) 3