Sujet de l`examen de janvier 2010

publicité
Module Programmation Objet Avancé
Licence Informatique 3éme année
Janvier 2009
Examen 1ère session – partie 2
Le pattern Visitor, défini dans le schéma ci-dessous, permet de définir, pour différents
objets, différentes opérations à mener sur ces objets, en découplant la représentation des
objets et les opéraitions à mener dessus. Chaque visiteur définit la façon dont il visite les
différents objets, et les différents objets peuvent accepter ou non la visite. La visite d'un
objet o par un visiteur v est déclenchée par l'appel o.accept(v), appel qui doit déclencher
celui de la méthode de visite correspondante.
On veut écrire un programme pour représenter le fonctionnement du système de santé :
les professionnels de santé peuvent visiter des patients qui sont crédules, confiants ou
méfiants. Un patient est représenté par la classe suivante :
public abstract class Patient{
protected int numSecu;
public Patient(int n){ this.numSecu = n; }
public abstract void accept(ProfessionnelSante p) throws RefusDeVisiteException;
// Renvoie vrai si une maladie est diagnostiquee, faux sinon (maladie inconnue ou bonne sante)
public boolean diagnostic(){
double diag = Math.random();
if(diag > 0.5){
System.out.println("Maladie diagnostiquée chez le patient" + this.numSecu);
return true;
}
else{
System.out.println("Maladie non diagnostiquée chez le patient " + this.numSecu);
return false;
}
}
public void prescription(){
System.out.println("Prescription pour le patient " + this.numSecu);
}
public void vaccine(){
System.out.println("Vaccination du patient " + this.numSecu);
}
}
Les codes des classes correspondant aux professionnels de santé sont donnés ci-après :
public abstract class ProfessionnelSante{
protected String nom;
public ProfessionnelSante(String n){ this.nom = n; }
public abstract void visiteCredule(Credule c);
public abstract void visiteConfiant(Confiant c);
public abstract void visiteMefiant(Mefiant m);
}
public class DiscipleHippocrate extends ProfessionnelSante{
public DiscipleHippocrate(String n){ super(n); }
public void visiteCredule(Credule p){
if(p.diagnostic()){
p.prescription();
}
}
public void visiteConfiant(Confiant p){
if(p.diagnostic()){
p.prescription();
}
}
public void visiteMefiant(Mefiant p){
if(p.diagnostic()){
p.prescription();
}
}
}
public class MedecinCupide extends ProfessionnelSante{
public MedecinCupide(String n){ super(n); }
public void visiteCredule(Credule p){
p.diagnostic();
p.prescription();
p.vaccine();
p.prescription();
p.vaccine();
}
public void visiteConfiant(Confiant p){
p.diagnostic();
p.prescription();
p.vaccine();
p.prescription();
}
public void visiteMefiant(Mefiant p){
p.diagnostic();
p.vaccine();
p.prescription();
}
}
public class Infirmiere extends ProfessionnelSante{
public Infirmiere(String n){ super(n); }
public void visiteCredule(Credule p){
p.vaccine();
}
public void visiteConfiant(Confiant p){
p.vaccine();
}
public void visiteMefiant(Mefiant p){
p.vaccine();
}
}
Sans modifier les classes précédentes, écrire les codes des classes Credule, Confiant et
Mefiant, sous-classes de Patient. Un patient crédule accepte toutes les visites, un patient
confiant accepte uniquement les visites des médecins qui respectent le serment
d'Hippocrate et les visites des infirmières et un patient méfiant refuse la vaccination et
n'accepte que les visites des médecins qui respectent le serment d'Hippocrate. Un refus
de visite doit entrainer le lancement d'une exception RefusDeVisiteException, qui doit
permettre de savoir quel patient a refusé une visite et quel professionnel a été refusé.
Ecrire également la classe RefusDeVisiteException.
Le pattern Visitor complet permet de visiter des structures, selon le schéma suivant :
Ecrire la classe EnsemblePatients qui encapsule un ensemble de patients stockés dans une
liste (la liste doit être une liste générique instanciée!) et implémente les méthodes
suivantes :
public void addPatient(Patient p) // ajoute un patient dans la liste
public void removePatient(Patient p) // supprime un patient de la liste
public void visite(ProfessionnelSante p) // fait visiter par p tous les patients de la liste
Correction
public class Credule extends Patient{
public Credule(int n){ super(n); }
public void accept(ProfessionnelSante p) throws RefusDeVisiteException{
p.visiteCredule(this);
}
}
public class Confiant extends Patient{
public Confiant(int n){ super(n); }
public void accept(ProfessionnelSante p) throws RefusDeVisiteException{
if((p instanceof DiscipleHippocrate) || (p instanceof Infirmiere))
{
p.visiteConfiant(this);
}
else{
throw new RefusDeVisiteException(p,this);
}
}
}
public class Mefiant extends Patient{
public Mefiant(int n){ super(n); }
public void accept(ProfessionnelSante p) throws RefusDeVisiteException{
if(p instanceof DiscipleHippocrate)
{
p.visiteMefiant(this);
}
else{
throw new RefusDeVisiteException(p,this);
}
}
}
public class RefusDeVisiteException extends Exception{
private ProfessionnelSante p;
private Patient pa;
public RefusDeVisiteException(ProfessionnelSante p, Patient pa){
super(pa.numSecu + " refuse la visite de " + p.nom);
this.p = p;
this.pa = pa;
}
}
public class EnsemblePatients{
private LinkedList<Patient> l;
public EnsemblePatients(){
this.l = new LinkedList<Patient>();
}
public void addPatient(Patient p){
this.l.add(p);
}
public void removePatient(Patient p){
this.l.remove(p);
}
public void visite(ProfessionnelSante p){
for(Patient pa:this.l){
try{
pa.accept(p);
}
catch(RefusDeVisiteException e){System.out.println(e.getMessage());}
}
}
public static void main(String[] arg){
MedecinCupide mc = new MedecinCupide("Purgon");
DiscipleHippocrate dh = new DiscipleHippocrate("Diafoirus");
Infirmiere i = new Infirmiere("Toinette");
Credule cr = new Credule(1);
Confiant co = new Confiant(2);
Mefiant me = new Mefiant(3);
EnsemblePatients ep = new EnsemblePatients();
ep.addPatient(cr);
ep.addPatient(co);
ep.addPatient(me);
ep.visite(mc);
ep.visite(dh);
ep.visite(i);
}
}
Téléchargement