Вы находитесь на странице: 1из 5

Module Programmation Objet Avanc Janvier 2009

Licence Informatique 3me anne

Examen 1re session partie 2

Le pattern Visitor, dfini dans le schma ci-dessous, permet de dfinir, pour diffrents
objets, diffrentes oprations mener sur ces objets, en dcouplant la reprsentation des
objets et les opraitions mener dessus. Chaque visiteur dfinit la faon dont il visite les
diffrents objets, et les diffrents objets peuvent accepter ou non la visite. La visite d'un
objet o par un visiteur v est dclenche par l'appel o.accept(v), appel qui doit dclencher
celui de la mthode de visite correspondante.

On veut crire un programme pour reprsenter le fonctionnement du systme de sant :


les professionnels de sant peuvent visiter des patients qui sont crdules, confiants ou
mfiants. Un patient est reprsent 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 diagnostique chez le patient" + this.numSecu);
return true;
}
else{
System.out.println("Maladie non diagnostique 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 donns ci-aprs :

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 prcdentes, crire les codes des classes Credule, Confiant et
Mefiant, sous-classes de Patient. Un patient crdule accepte toutes les visites, un patient
confiant accepte uniquement les visites des mdecins qui respectent le serment
d'Hippocrate et les visites des infirmires et un patient mfiant refuse la vaccination et
n'accepte que les visites des mdecins 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 schma suivant :
Ecrire la classe EnsemblePatients qui encapsule un ensemble de patients stocks dans une
liste (la liste doit tre une liste gnrique instancie!) et implmente les mthodes
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);
}

Вам также может понравиться