Vous êtes sur la page 1sur 5

Module Programmation Objet Avancé Licence Informatique 3éme année

Examen 1ère session – partie 2

Janvier 2009

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.

déclencher celui de la méthode de visite correspondante. On veut écrire un programme pour représenter le

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 :

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);

}

}