Vous êtes sur la page 1sur 129

B0130MS20050801

EO05

INTRODUCTION A LA PROGRAMMATION ORIENTE OBJET

Centre de formation d'Atos Origin


13, rue de Bucarest - 75008 Paris Tl. : 01 55 30 62 00 - Fax : 01 55 30 62 30 Mail : formation@atosorigin.com

www.formation.fr.atosorigin.com

INTRODUCTION A LA PROGRAMMATION ORIENTEE OBJET


EO05 V3.1

Introduction la programmation oriente objet


Public: dveloppeurs. Objectif: prparation au passage la programmation objet par la prsentation des concepts au travers d'exemples.

EO05 V3.1

Contenu de la prsentation
1. 2. 3. 4. 5. 6. 7. 8. 9. Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

EO05 V3.1

Les langages traditionnels

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multitiers.

EO05 V3.1

Les langages traditionnels

Une approche fonctionnelle


Sparation des traitements et des donnes. Multiplicit des fonctions. Pas de type de donnes volu. Pas de possibilit d'excuter systmatiquement des contrles applicatifs. Pas de limitation d'accs aux donnes.

EO05 V3.1

Les langages traditionnels

Programmation
Les traitements n'ont qu'une vue limite des donnes sur lesquelles ils s'appliquent. //Exemple c
char prenom[5]; strcpy (prenom,"Veronique"); //Le buffer prenom est trop petit //On crase donc une zone mmoire sans le savoir prenom V e r o n i q u e \0

crasement

Le programme s'excute jusqu' ce que l'erreur provoque une anomalie bloquante. L'anomalie n'tant pas toujours en rapport direct avec l'erreur, le rsolution du problme est difficile.

EO05 V3.1

Les langages traditionnels

Mthodologie
Les mthodes traditionnelles s'appuient sur deux types de modles pour dcrire une application. Le modle de donnes. Inventaire des donnes suivi de la dfinition de leur structure et de leurs relations. Le modle de traitements. Aperu de la dynamique de l'application, du squencement des traitements et dfinition des algorithmes. Les donnes et les traitements ne sont pas lis par le langage:
Faible cohrence entre les deux domaines; Difficult de comprhension de la smantique des donnes sans tude de leurs comportements; Difficult de dfinir des traitements sans connaissance de la structure des donnes et de leur relations.

Le changement de la structure des donnes implique la rcriture des traitements.

EO05 V3.1

Les langages traditionnels

Sparation des traitements et des donnes

Donnes Personne: nom prnom dateNaissance scuritSociale liste Enfants


Pas de lien au niveau du langage

Traitements (fonctions) quelNom( Personne p) quelAge( Personne p) nbEnfants ( Personne p) ajoutEnfant( Personne p, Personne e) .

Utilisation: Personne burma; Personne zoe; int age; age=quelAge(burma ); ajoutEnfant(burma,zoe); age=dateDuJour burma.dateNaissance ;

Pas de contrle d'accs sur les donnes

EO05 V3.1

Les langages traditionnels

Multiplicit des fonctions


L'impossibilit d'avoir plusieurs fonctions de mme nom entrane la multiplicit de noms pour des fonctionnalits identiques.
Personne agePersonne(Personne p) LivreAncien ageLivre(LivreAncien l)

4 fonctions de noms diffrents pour la mme question (quel ge) sur 4 donnes de types diffrents

Voiture ageVoiture(Voiture v)

BouteilleVin ageBouteille(BouteilleVin b)

EO05 V3.1

Les langages objets

Les langages objets Une approche systmique


Une objet est vu comme un systme regroupant ses donnes et ses traitements.
Personne: nom prnom dateNaissance scuritSociale listeEnfants Utilisation: quelNom( ) quelAge( ) nbEnfants ( ) ajoutEnfant(Personne e) Personne burma; Personne zoe; int age; age=burma.quelAge( ); burma.ajoutEnfant(zoe);

Attributs (donnes)

Mthodes (comportement)

10

EO05 V3.1

Les langages objets

Une seule vision de l'extrieur


Les mthodes ayant la mme fonctionnalit peuvent avoir le mme nom. L'criture des applications est plus homogne.
Personne int getAge( ) Utilisation: Personne pers; Voiture voit; LivreAncien liAn; BouteilleVin boVi; = pers.getAge( ); = voit.getAge( ); = liAn.getAge( ); = boVi.getAge( ); LivreAncien int getAge( ) Voiture int getAge( ) BouteilleVin int getAge( )

Le langage recherche dans la classe de l'objet si la mthode est connue. Oui. Elle sera excute. Non. Il y aura une erreur de compilation.

11

EO05 V3.1

Les objets et leurs modles

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

12

EO05 V3.1

Les objets et leurs modles

Les objets et leurs modles


Classe et instance. Encapsulation. Message. Attributs et mthodes statiques. Exemple "static". Package. Exemple tape1.

13

EO05 V3.1

Classe et instance

Classe
Une classe dfinit des objets identiques ( au sens de la classification) par leur structure ( attributs ) et leur comportement (mthodes ) Ce n'est qu'un modle. Il n'y a pas de rservation mmoire.

Instance
Une instance (ou un objet) est une ralisation d'une classe. Il y a consommation d'espace mmoire. C'est une variable fabrique partir d'un modle (sa classe). Une instance contient une rfrence implicite sa classe.

Dfinir une nouvelle classe c'est dfinir un nouveau type de donnes ( structure + comportement).

14

EO05 V3.1

Classe et instance

class Voiture {
Moteur moteur Roue [ ] roues Frein [ ] freins Color couleur . void start( ) {} void stop( ) {} void tourne(float angle) {}

Instances de Voiture

15

EO05 V3.1

Encapsulation

mthodes publiques

attributs privs

mthodes prives

L'encapsulation c'est pouvoir contrler l'accs un objet

16

EO05 V3.1

Encapsulation

Accs public
Attributs
Pas de restriction daccs. Peuvent tre manipuls sans aucun contrle de lobjet. Certains langages (Smalltalk) interdisent laccs public aux attributs. En principe les attributs ne sont pas publics, sauf s'ils sont constants.

Mthodes
Les comportements publics dfinissent la manire dont lobjet doit tre utilis. Cet ensemble constitue linterface de lobjet.

17

EO05 V3.1

Encapsulation

Accs priv
Attributs
Ils ne sont accessibles qu travers des comportements publics. Cela permet dassurer leur cohrence.

Mthodes
Ce sont des mthodes internes qui sont appeles par dautres mthodes. Elles sont exclues de linterface de lobjet.

18

EO05 V3.1

Encapsulation
Les objets contrlent leurs donnes. C'est la garantie d'une utilisation correcte des objets.
class Compte { private float solde; . public void debiter(float montant){ if (montant <= solde ){ solde-=montant; } else { lancer une exception } } } Compte compte; . compte.solde-=20; compte.debiter(20);

Erreur la compilation. L'attribut solde est private

Utilisation correcte. La mthode debiter est public La classe Compte possde des rgles mtiers. solde ne doit pas tre ngatif

19

EO05 V3.1

Encapsulation
C'est la possiblit de modifier l'implmentation d'une classe sans remettre en cause l'application.
class Complex { private float partieReelle; private float partieImaginaire; public Complex(float pr, float pi) { partieReelle=pr; partieImaginaire=pi; } public Complex add(Complex c){ . } .. } class Complex { private float arg; private float module; public Complex(float pr, float pi) { module=(pr2+pi2)1/2; if (pr==0) arg=pi>0?PI/2: -PI/2; else arg=arctg(pi/pr); } public Complex add(Complex c) {. } }

Complex c1 = new Complex(10,2); Complex c2 = new Complex(20,10); Complex c3; c3= c1.add (c2);

Dans l'application on utilise les Complex via leurs mthodes. L'implmentation change. L'application reste inchange.

20

EO05 V3.1

Message

L'envoi de messages est la seule faon de manipuler les objets

stop( )

Les messages sont synchrones ou asynchrones: - Cration d instance (constructeur); - Suppression d instance (destructeur); - Accesseur d attribut (get) ; - Mutateur dattribut (set); - Opration d instance (mthode.).

21

EO05 V3.1

Message

La fentre Client connat la rfrence compteBurma dont elle affiche le solde. En appuyant sur Dbiter, le message debiter(12000) est envoy compteBurma : compteBurma.debiter(12000);

Fentre Client debiter(12000); compteBurma est une instance de la classe Compte debiter est une mthode de la classe Compte

compteBurma

22

EO05 V3.1

Message

Constructeur
Un constructeur possde un rle d'initialisateur d'objet. On ne peut obtenir un objet sans tre pass par un constructeur. C'est une garantie d'initialisation correcte des objets. Un constructeur est une mthode ayant le mme nom que la classe.
Dans lapplication: Client m1=null; Client m2=null; int num1; num1=m1.getIdent( ); m1 = new Client( Dupont ); m2 = new Client(1234); num1=m1.getIdent( ); Ok, car l'objet rfrenc par m1 existe. Dclaration de rfrences Erreur la compilation. m1 est une rfrence null

class Client { private int ident; private String nom; public Client( String nom) { ident= recherche dun code libre; this.nom=nom; sauvegarde dans un systme de persistance } public Client( int ident) { this.ident=ident; recherche du client ident nom= nom trouv; } public int getIdent( ) {return ident;} }

Instanciation par l'oprateur new puis appel d'un constructeur

23

EO05 V3.1

Message

Constructeur
Dclaration de rfrences. Dans lapplication: Client m1=null; Client m2=null; int num1; num1=m1.getIdent( ); Instanciation par l'oprateur new, puis appel d'un constructeur. m1 = new Client( Dupont ); m2 = new Client(1234); num1=m1.getIdent( ); ident 1234 nom Ok, car l'objet rfrenc par m1 existe. "Robert" m2 "Dupont" m1

Erreur la compilation. m1 est une rfrence null.

ident 111 nom

24

EO05 V3.1

Message

Destructeur
Un destructeur est appel quand un objet est dtruit. Cet appel est explicite ou implicite ( dpend du langage). Une classe ne possde qu'un seul destructeur. Son rle est de librer les ressources alloues lors de la cration ou durant la vie de l'objet. En C++, son nom est celui de la classe prfix par ~ . En Java, il n'y a pas de destructeur proprement parl, mais la mthode finalize( ) est appele automatiquement par le Garbage Collecteur (GC ou ramasse miette). En Java, quand un objet n'est plus rfrenc , l'espace qu'il occupe est candidat pour tre rcupr par le GC.

25

EO05 V3.1

Message

Accesseur, getter
Un accesseur permet de rcuprer un attribut, par valeur (type primitif) ou par rfrence (type objet).
Dans l'application Client m1,m2; String s1,s2; m1 = new Client( Dupont ); m2 = new Client(1234); s1=m1.getNom( ); s2=m2.getNom( ); //s1=m1.nom;

class Client { private int ident; private String nom; public Client( String nom){ } public Client( int ident) { } public String getNom( ) { return nom; } . public int getIdent( ) { return ident; } }

Impossible: l'attribut nom est private.

26

EO05 V3.1

Message

Mutateur, setter
Un mutateur permet de modifier un attribut, par valeur (type primitif) ou par rfrence (type objet).

class Client { private int ident; private String nom; public Client( String nom){ } public Client( int ident) { } public void setNom(String nom ) { vrification de la validit de nom si ok this.nom=nom; si nook lancer une exception } . }

Dans lapplication: Client m1; m1 = new Client(1234); m1.setNom( Sandrine ); //m1.nom= Sandrine ;

Impossible l'attribut nom est private

27

EO05 V3.1

Message

Mthode
Un mthode sapplique un objet. Elle possde ou non des arguments.
class Client { private int ident; private String nom; public Client( String nom){ } public Client( int ident) { } public String toString( ) { return nom + + ident;} public void toString( Fenetre f) { } } Dans lapplication: Client m1; String s1; Fenetre f= new Fenetre( ); m1 = new Client( Dupont ); m2 = new Client(1234); s1=m1.toString( ); m1.toString(f ); Le choix de la mthode se fait sur la liste des types des arguments de la mthode. Ici la mthode toString est surcharge ( 2 variantes ) C'est aussi une redfinition ( public String toString( ) existe dj dans la classe Object ).

28

EO05 V3.1

static

Attribut et mthode "static"


Un attribut "static" (attribut de classe par opposition un attribut d'instance) est stock dans la classe. Une mthode "static" s'invoque directement sur la classe.
class VoitureFiat { static String marque="Fiat" String immatriculation . public static String getMarque( ){ return marque; } public String getImmatriculation( ){ return immatriculation; } System.out.println(VoitureFiat.getMarque( ));

Dans lapplication:

getMarque() est directement invoque sur la classe VoitureFiat

out est attribut static de la classe System

29

EO05 V3.1

Exemple

Exemple
Mthodes et attributs "static" Gnration de documentation (outil javadoc) Classes: Service TestService

30

EO05 V3.1

//TestService.java
package test; import utilitaire.Service; public class TestService { public static void main(String[] args) { System.out.println("test.TestService"); System.out.println(); Service.message("Message"); Service.ln(); Service.message("Message Avec Trait Avant",Service.T_AV); Service.ln(); Service.message("Message Avec Trait Apres",Service.T_AP); Service.ln(); Service.message("Message Avec Trait Avant et Aprs", Service.T_AV+Service.T_AP); Service.ln(); Service.pause(); Service.ln(); Service.pause("Prompt avant pause"); Service.message("test.TestService termin",Service.T_AP); } }

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

test.TestService
Message ======================== Message Avec Trait Avant Message Avec Trait Apres ======================== ================================= Message Avec Trait Avant et Aprs ================================= ================ Frapper la touche <entree> pour continuer ================ Prompt avant pause ================ Frapper la touche <entree> pour continuer ================ test.TestService termin ========================

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

/** * Service.java */
package utilitaire; import java.io.File; import java.io.IOException; import java.util.Iterator; public class Service { /** * Positionne un trait avant le message de la mthode message( String mess, * int motif ) */ public static final int T_AV=1; /** * Positionne un trait aprs le message de la mthode message ( String * mess,int motif) */ public static final int T_AP=2; static String messPause="\n================"+ " Frapper la touche <entree> pour continuer ================"; /** * Marque une pause avec le prompt standard */ public static final void pause(){ pause(""); } /** * Marque une pause avec un prompt personnalis + le prompt standard * @param mess prompt personnalis */ public static final void pause(String mess){ byte [] rep =new byte[1]; if(mess==null)mess=""; System.out.print(mess); System.out.println(messPause); try{ System.in.read(rep); System.in.skip(System.in.available()); } catch(IOException e) {System.out.println("Pb dans Service.pause: "+ e.getMessage());} }

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

/** * Ecrit mess sur System.out * @param mess message envoy sur System.out */ public static final void message(String mess){ if(mess==null)mess=""; System.out.println(mess); } /** * Ecrit mess dcor par motif sur System.out * @param mess message crit sur System.out * @param motif spcifie le dcor du message */ public static final void message(String mess,int motif){ if(mess==null)mess=""; char [] decoration = new char[mess.length()]; int i; for(i=0;i<mess.length();i++){ decoration[i]='='; } if((motif & Service.T_AV) == Service.T_AV){ System.out.println(decoration); } System.out.println(mess); if((motif & Service.T_AP)== Service.T_AP){ System.out.println(decoration); } } /** * Ecrit une nouvelle ligne sur System.out * */ public static final void ln(){ System.out.println(); } /** * Vide un Iterator sur System.out * */ public static final void message(Iterator iterator){ if(iterator==null)return; while(iterator.hasNext())message(iterator.next().toString()); }

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

/** * Retourne l'extension d'un fichier. */ public static String getExtension(File f) { return getExtension(f.getName()); } /** * Retourne l'extension d'un fichier. */ public static String getExtension(String int i = fileName.lastIndexOf('.'); if (i > 0 && i < fileName.length() - 1) { return fileName.substring(i+1); } else return null; fileName) {

/** * Retourne le nom d'un fichier sans l'extension */ public static String getFirstName(File f) { return getFirstName(f.getName()); } /** * Retourne le nom d'un fichier sans l'extension */ public static String getFirstName(String fileName) { int i = fileName.lastIndexOf('.'); if(i!=-1)return fileName.substring(0,i); else return fileName; } }

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

exemple: mthodes et attributs statiques Gnration de documentation classes: TestService, Service

package

Package

Meilleur nommage.
atos.Client altran.Client

Meilleur rangement. A un package correspond un rpertoire. Meilleure encapsulation. Les classes d'un package se connaissent entre elles (encapsulation au niveau du package). Utilisation possible de classes de mme nom.
java.util.Date java.sql.Date

31

EO05 V3.1

Exemple

Exemple etape1
Classes et instances Encapsulation Communication avec les objets Package Classes: etape1.Client test.TestEtape1 utilitaire.Service

32

EO05 V3.1

exemple : Encapsulation, constructeur, mthode, rfrence null classes :Service, TestEtape1, Client

etape1

//Client.java
package etape1; public class Client { String nom; String prenom; public Client(){ this("Inconnu","Inconnu"); } public Client(String nom, String prenom){ this.nom=nom; this.prenom=prenom; } public String toString(){ return "className: "+ this.getClass().getName() + ' ' + nom + '|' + prenom; } public String getNom() { return nom; } public String getPrenom() { return prenom; } }

exemple : Encapsulation, constructeur, mthode, rfrence null classes :Service, TestEtape1, Client

etape1

//TestEtape1.java package test; import etape1.Client; import utilitaire.Service; // RETIRER LE COMMENTAIRE 1 public class TestEtape1 { public static void main(String[] args) { Service.message("test.TestEtape1",Service.T_AP); Service.ln(); Service.message("Client par dfaut:",Service.T_AP); Client client1=new Client(); Service.message(client1.toString()); Service.ln(); Service.pause(); arguments", Service.message("Client instanci avec le constructeur 2 Service.T_AP); Client client2=new Client("Rabbit","Roger"); Service.message(client2.toString()); Service.ln(); Service.pause(); // Service.message("Test de l'encapsulation",Service.T_AP); String s = client2.nom; //METTRE EN COMMENTAIRE 2 Service.message("Nom du client2= " +client2.getNom()); Service.ln(); Service.pause(); Service.message("Test de la rfrence null",Service.T_AP); Client client3=null; client3=new Client("Hugo","Victor"); //RETIRER LE COMMENTAIRE 3 Service.message(client3.toString()); Service.pause(); Service.message("test.TestEtape1 termin!",Service.T_AP); } }

exemple : Encapsulation, constructeur, mthode, rfrence null classes :Service, TestEtape1, Client

etape1

test.TestEtape1
===============

Client par dfaut: ================== className: etape1.Client Inconnu|Inconnu ================ Frapper la touche <entree> pour continuer ================ Client instanci avec le constructeur 2 arguments =================================================== className: etape1.Client Rabbit|Roger ================ Frapper la touche <entree> pour continuer ================ Test de l'encapsulation ======================= Nom du client2= Rabbit ================ Frapper la touche <entree> pour continuer ================ Test de la rfrence null ========================= className: etape1.Client Hugo|Victor ================ Frapper la touche <entree> pour continuer ================ test.TestEtape1 termin! ========================

exemple : Encapsulation, constructeur, mthode, rfrence null classes :Service, TestEtape1, Client

etape1

3. Types et Interfaces

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (Hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

33

EO05 V3.1

Interface

Type: permet de se placer d'un point de vue conceptuel plutt que d'un point de vue implmentation (classe) Interface: permet de spcifier un modle de comportement (liste de mthodes abstraites uniquement) Des classes implmentant un "interface" particulier spcifient ainsi qu'elles possdent ce type de comportement. Autrement dit, elles implmentent toutes les mthodes spcifies dans l'interface.

34

EO05 V3.1

Interface
Documentation issue de la class java.util.Arrays
public static void sort(Object[] a) Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. All elements in the array must implement the Comparable interface. Furthermore, all elements in the array must be mutually comparable (that is, e1.compareTo(e2) must not throw a ClassCastException for any elements e1 and e2 in the array).This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort. The sorting algorithm is a modified mergesort (in which the merge is omitted if the highest element in the low sublist is less than the lowest element in the high sublist). This algorithm offers guaranteed n*log(n) performance. Parameters: a - the array to be sorted. Throws: ClassCastException - if the array contains elements that are not mutually comparable (for example, strings and integers). See Also: Comparable

35

EO05 V3.1

Interface
interface Comparable { public abstract int compareTo(Object o) }

class Client implements Comparable{ public int compareTo(Object o){ if ( ! (o instanceof Client) throw new ClassCastExeption( ); else { on compare this et o d'un point de vue Client . En fonction du resultat return 0 , -1 ou +1 } } }

//Dans l'application Comparable [] t = new Comparable[10]; t[0]= new Client(); t[1]= new Client(); t[9]= new Client(); Arrays.sort(t);

36

EO05 V3.1

Exemple

Exemple etape2
Interface: etape2.Compte Classes: etape2.Client etape2.CompteCourant test.TestEtape2 utilitaire.Service

37

EO05 V3.1

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

//Client.java
package etape2; public class Client { String nom; String prenom; public Client(){ this("Inconnu","Inconnu"); } public Client(String nom, String prenom){ this.nom=nom; this.prenom=prenom; } public String toString(){ return "className: "+ this.getClass().getName() + ' ' + nom + '|' + prenom; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; }

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

//Compte.java
package etape2; import java.util.Date; public interface Compte { int getIdent(); Date getDateCreation(); float getSolde(); Client getOwner(); void crediter(float credit); void debiter(float debit); }

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

//CompteCourant.java
package etape2; import java.text.DateFormat; import java.util.Date; import java.util.Locale; public class CompteCourant implements Compte { int ident; float solde; Date dateCreation; Client owner; public CompteCourant(){ this(0,null); } public CompteCourant(int ident , Client owner){ this.ident=ident; this.owner=owner; dateCreation=new Date(); solde=0; } public int getIdent() { return ident; } public Date getDateCreation() { return dateCreation; } public float getSolde() { return solde; } public Client getOwner() { return owner; } //MODIFIER LE NOM DE LA METHODE AFIN D'AVOIR UNE ERREUR D'IMPLEMENTATION public void crediter(float credit) { solde+=credit; } public void debiter(float debit) { solde-=debit; }

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

public String toString(){ DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE); return "className: " + this.getClass().getName() + ' ' + ident + '|' + owner.getNom() + '|' + owner.getPrenom() + '|' + dateFormat.format(dateCreation) + '|' + solde; } }

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

//TestEtape2.java
package test; import import import import etape2.Client; etape2.Compte; etape2.CompteCourant; utilitaire.Service;

public class TestEtape2 { public static void main(String[] args) { Service.message("test.TestEtape2",Service.T_AP); Service.ln(); Client client1=new Client("Rabbit","Roger"); Compte c1=new CompteCourant(1,client1); Compte c2=new CompteCourant(2,client1); Service.message("c1 et c2 apres cration",Service.T_AP); Service.message(c1.toString()); Service.message(c2.toString()); Service.pause(); c1.crediter(100); c2.crediter(200); Service.message("c1 et c2 apres crediter",Service.T_AP); Service.message(c1.toString()); Service.message(c2.toString()); Service.pause(); client1.setPrenom("Robert"); Service.message("c1 et c2 apres modification de client1"); Service.message(c1.toString()); Service.message(c2.toString()); Service.pause(); Service.message("test.TestEtape2 TERMINE!",Service.T_AP); } }

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

test.TestEtape2
===============

c1 et c2 apres cration ======================= className: etape2.CompteCourant 1|Rabbit|Roger|20 juillet 2005|0.0 className: etape2.CompteCourant 2|Rabbit|Roger|20 juillet 2005|0.0 ================ Frapper la touche <entree> pour continuer ================ c1 et c2 apres crediter ======================= className: etape2.CompteCourant 1|Rabbit|Roger|20 juillet 2005|100.0 className: etape2.CompteCourant 2|Rabbit|Roger|20 juillet 2005|200.0 ================ Frapper la touche <entree> pour continuer ================ c1 et c2 apres modification de client1 className: etape2.CompteCourant 1|Rabbit|Robert|20 juillet 2005|100.0 className: etape2.CompteCourant 2|Rabbit|Robert|20 juillet 2005|200.0 ================ Frapper la touche <entree> pour continuer ================ test.TestEtape2 TERMINE! ========================

exemple : Interface, implementation, association interface : Compte classes : Service, TestEtape2, Client, CompteCourant

Etape2

Spcialisation d'une classe (Hritage)

Contenu de la prsentation
1. 2. 3. 4. 5. 6. 7. 8. 9. Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

38

EO05 V3.1

Hritage

Hritage

Une classe permet de fabriquer des objets (instanciation). Une classe permet de fabriquer d'autres classes par hritage. L'hritage correspond a la relation "est un":
Si la classe B hrite de la classe A, alors une instance de B peut tre vue comme une instance de A, mais plus spcifique; L'ensemble des instances de B est inclus dans l'ensemble des instances de A; On peut voir un "Mammifre marin" comme un "Mammifre".

39

EO05 V3.1

classe abstraite

abstract class OG { float x; float y; translate( float dx ,float dy ) { } translate ( Vecteur v) { } abstract void dessine ( ) ; abstract float surface ( ) ;

Hritage

Gnralisation

Spcialisation

mthodes abstraites

class Carre { float cote; void dessine ( ) { } float surface (return cote2; ) }

class Cercle { float rayon; void dessine ( ){ } float surface (return PI * rayon2; ) }

tableau d'OG class Dessin { OG [] t; void dessine ( ){ } float surface ( ){ } void translate( float dx ,float dy ) { } void translate ( Vecteur v) {} void inserer(OG o) { } }

40

EO05 V3.1

Hritage

La classe abstraite OG
abstract class OG { float x; float y; public translate( float dx ,float dy ) { x+=dx; y+=dy; } public translate ( Vecteur v) { x += v.getX(); y += v.getY(); } abstract void dessine ( ) ; abstract float surface ( ) ; Mthodes abstraites. Elles doivent tre obligatoirement redfinies dans les classes drives concrtes. OG est abstraite. Elle ne peut tre instancie. Elle peut tre drive.

translate avec 2 arguments de type float.

Surchage de translate avec 1 argument de type Vecteur.

41

EO05 V3.1

Hritage

Rduction du code
Cas des mthodes translate. Pas de rcriture (redfinition) dans le cas de Carre et Cercle qui se comportent d'une manire standard du point de vue de la translation. Rcriture (redfinition) dans le cas de Dessin: c'est une classe compose d'OG, il faut donc translater chaque lment du tableau t.
class Dessin { OG [] t; void translate( float dx ,float dy ) { for( int i =0 ; i < t.length ; i ++) t[i].translate(dx,dy); } void translate ( Vecteur v) { for( int i =0 ;i < t.length ; i++) t[i].translate(v ); } } Si t[i] rfrence un Carre ou un Cercle, c'est translate d'OG qui sera excute Si t[i] rfrence un Dessin c'est translate de Dessin qui sera excute (Voir polymorphisme ). On remarque que l'ajout d'une nouvelle classe drive d'OG n'entrane pas la rcriture des mthodes translate.

42

EO05 V3.1

Le polymorphisme

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

43

EO05 V3.1

Le polymorphisme

Le polymorphisme
Prsente plusieurs formes. Possibilit de considrer des instances de classes diffrentes d'un mme point de vue. Ex: voir un Carre , un Cercle , un Dessin comme des OG. Possiblit d'envoyer des rfrences de mme type un mme message et d'obtenir des comportements diffrents (c'est--dire ceux des objets rfrencs et non ceux des rfrences). Ex: Sur une rfrence r d'OG faire r.dessine( ) Une application peut ainsi manipuler de faon homogne des objets htrognes. On obtient du polymorphisme par:
Hritage entre classes; Implmentation d'interfaces.

44

EO05 V3.1

Le polymorphisme

Le polymorphisme
Une rfrence sur un objet est automatiquement convertie vers une rfrence de sa superclasse Une rfrence sur un objet est automatiquement convertie vers une rfrence d'interface qu'implmente sa classe
Ok, car Carre extends OG. OG t1, t2 , t3 ; float s1,s2,s3; t1= new Carre ( ) ; t2 = new Cercle ( ) ; t3 = new Dessin ( ); s1=t1.surface( ); s2=t2.surface( ); s3=t3.surface( ); Ok, car Client implements Comparable. Comparable c1,c2; c1= new Client(); c2= new Client(); int r; A la compilation, surface est recherche dans la classe OG. A l'xcution, c'est surface de l'objet rfrenc qui est excute. r= c1.compareTo(c2);

A la compilation, compareTo est recherche dans l'interface Comparable. A l'excution c'est compareTo de Client qui est excute.

45

EO05 V3.1

Le Polymorphisme
Cas des mthodes dessine et surface dessine et surface sont rdfinir dans tous les cas car elles sont abstraites dans OG. Dans le cas particulier de Dessin (compos d'OG) le polymorphisme joue pleinement rendant l'criture trs simple. Une seule ligne de code pour dessiner un OG quelconque
class Dessin extends OG { OG [] t; void dessine( ) { for( int i =0 ; i < t.length ; i ++) t[i].dessine( ); } float surface ( ) {float s=0; for( int i =0 ;i < t.length ; i++) s+= t[i].surface( ); return s;} } void inserer(OG o, int pos ) { OG[pos]= o; } A la compilation c'est dessine d'OG A l'xcution c'est le dessine de l'objet rfrenc. Mme remarque pour surface

On peut passer un OG quelconque la mthode inserer

46

EO05 V3.1

Exemple Etape3

Heritage et polymorphisme
Interface: etape3.Compte Classes: etape3.Client etape3.CompteCourant etape3.CompteEpargne test.TestEtape3 utilitaire.Service

47

EO05 V3.1

exemple : Heritage, polymorphisme interface : Compte classes : Service, TestEtape3, Client, CompteCourant, CompteEpargne

Etape3

//CompteEparge.java
package etape3; public class CompteEpargne extends CompteCourant { float taux; public CompteEpargne(){ this(0,null,0); } public CompteEpargne(int ident , super(ident,owner); this.taux=taux; } public float getTaux() { return taux; } public void setTaux(float taux) { this.taux = taux; } public String toString() { return super.toString()+ '|'+ taux; } Client owner , float taux){

exemple : Heritage, polymorphisme interface : Compte classes : Service, TestEtape3, Client, CompteCourant, CompteEpargne

Etape3

//TestEtape3.java
package test; import import import import import etape3.Client; etape3.Compte; etape3.CompteCourant; etape3.CompteEpargne; utilitaire.Service;

public class TestEtape3 { public static void main(String[] args) { Service.message("test.TestEtape3",Service.T_AP); Service.ln(); Client client1=new Client("Rabbit","Robert"); Compte [] comptes= new Compte[3]; comptes[0]=new CompteCourant(1,client1); comptes[1]=new CompteEpargne(3,client1,3.3f); comptes[2]=new CompteCourant(2,client1); Service.message("comptes apres cration",Service.T_AP); for (int i = 0; i < comptes.length; i++) { Service.message(comptes[i].toString()); } Service.pause(); comptes[0].crediter(100); comptes[1].crediter(200); comptes[2].crediter(300); Service.message("comptes apres crditer",Service.T_AP); for (int i = 0; i < comptes.length; i++) { Service.message(comptes[i].toString()); } Service.pause(); Service.message("test.TestEtape3 TERMINE !",Service.T_AP); } }

exemple : Heritage, polymorphisme interface : Compte classes : Service, TestEtape3, Client, CompteCourant, CompteEpargne

Etape3

test.TestEtape3
===============

comptes apres cration ====================== className: etape3.CompteCourant 1|Rabbit|Robert|9 mars 2005|0.0 className: etape3.CompteEpargne 3|Rabbit|Robert|9 mars 2005|0.0|3.3 className: etape3.CompteCourant 2|Rabbit|Robert|9 mars 2005|0.0 ================ Frapper la touche <entree> pour continuer ================ comptes apres crditer ====================== className: etape3.CompteCourant 1|Rabbit|Robert|9 mars 2005|100.0 className: etape3.CompteEpargne 3|Rabbit|Robert|9 mars 2005|200.0|3.3 className: etape3.CompteCourant 2|Rabbit|Robert|9 mars 2005|300.0 ================ Frapper la touche <entree> pour continuer ================ test.TestEtape3 TERMINE ! =========================

exemple : Heritage, polymorphisme interface : Compte classes : Service, TestEtape3, Client, CompteCourant, CompteEpargne

Etape3

La gnricit

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

48

EO05 V3.1

La gnricit

La gnricit
Dans ce type de programmation, ce ne sont plus des valeurs ou des objets qui sont arguments, mais des types de donnes Concevoir une Pile de Livre et une Pile de Process Les mthodes sont semblables: Empiler, Depiler, ; seul le type manipul change. En C++, cela est obtenu par des Template qui peuvent tre vus comme des gnrateurs de classes:
Les classes permettent la fabrication d'objets; Les templates permettent la fabrication de Classes.

En Java, on obtient des traitements gnriques l'aide des interfaces.

49

EO05 V3.1

La gnricit

Arrays.sort(Object [ ] t)
La classe Arrays fait partie du package java.util L'implmentation de sort est possible grace l'interface java.lang.Comparable (voir diapo 35 )
class Arrays { void sort ( Object [ ] t ) { boucle { if (( t[i] instanceof Comparable) && (t[i+1] instanceof Comparable) ) { if (t[i].compareTo(t[i+1]) >0 ){ on permutte t[i] et t[i+1] } else throw new ClassCastException ( ) } ..}} On peut imaginer une implmentation du style: comparaison des lments 2 2 et permutation si l'ordre est incorrect.

La mthode sort n'a aucune ide sur comment est faite la comparaison. Ce que sait sort c'est qu'il peut comparer !

Si la(les) classe(s) des lments du tableau n'implmente(nt) pas Comparable, on lance une exception qui alerte l'application.

50

EO05 V3.1

La gnricit

Template C++ (modle de classe)


template<class X> class Pile { private: Pile * precedent; X * data; Pile(Pile *p, X * d); public: Pile( ){precedent=NULL; data=NULL;} void empile(X * d); void depile(void ); void erase(void); void lister(void); } //application Pile<Personne> pilePersonne; Personne p1; pilePersonne.empile(&p1); Pile<String> pileString; pileString.lister( ); pilePersonne est une instance de la classe Pile<Personne> contruite partir du template Pile. Idem pour pileString.

51

EO05 V3.1

La gnricit

Template C++ (modle de fonction)

//application template<class X> void sort (X t[],int n ) { X tmp; if(t[i] > t[i+1]) { tmp =t[i]; t[i]=t[i+1]; t[i+1]=tmp; } } Personne tp[10] ; String ts[100]; . . sort(tp,10); sort(ts,100);

Fonctionne si les classes Personne et String implmentent l'oprateur >

La fonction sort trie un tableau de X en comparant les lments deux deux par l'oprateur > puis en les permuttant avec la variable tmp.

52

EO05 V3.1

Exemple Etape4

Composition, notion de fabrique, gnricit, collection


Interface: etape4.Compte Classes: etape4.Banque etape4.Client etape4.CompteCourant etape4.CompteEpargne test.TestEtape4 utilitaire.Service

53

EO05 V3.1

//Banque.java
package etape4; import import import import import import java.util.Collection; java.util.HashMap; java.util.HashSet; java.util.Iterator; java.util.Map; java.util.Set;

public class Banque { /** * Extension par dfaut pour les fichiers de sauvegarde de Banque */ public static final String banqueExt="serial"; String nom; Map comptes ; int maxCompteIdent=0; Set clients ; public Banque (String nom){ this.nom=nom; comptes=new HashMap(); // Remplacer HashMap par TreeMap // comptes=new TreeMap(); clients=new HashSet(); } public Compte getCompte(int ident){ return (Compte)comptes.get(new Integer(ident)); } public Client newClient(String nom,String prenom){ Client client=new Client(nom,prenom); if (clients.contains(client)) return client; else {clients.add(client); return client; } } public Compte newCompteCourant(Client owner){ maxCompteIdent++; Compte compte = new CompteCourant(maxCompteIdent,owner); comptes.put(compte.getIdent(),compte); return compte; }

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

public Compte newCompteEpargne(Client owner,float taux){ maxCompteIdent++; Compte compte = new CompteEpargne(maxCompteIdent,owner,taux); comptes.put(compte.getIdent(),compte); return compte; } public void removeCompte(int ident){ comptes.remove(new Integer(ident)); } public void crediterCompte(int ident,float credit){ Compte compte = getCompte(ident); if(compte != null ) compte.crediter(credit); }

public void debiterCompte(int ident,float debit){ crediterCompte(ident, - debit ); } public String toString() { StringBuffer s = new StringBuffer("className: " + this.getClass().getName() + ' ' + nom); Collection coll = comptes.values(); Iterator iterator=coll.iterator(); while (iterator.hasNext()){ s.append("\n\t").append(iterator.next()); } return s.toString(); } public Iterator iterComptes(){ Collection coll = comptes.values(); Iterator iterator=coll.iterator(); return iterator; } public Iterator iterClients(){ return clients.iterator(); } }

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

//Client.java
package etape4; public class Client { String nom; String prenom; Client(){ this("Inconnu","Inconnu"); } Client(String nom, String prenom){ this.nom=nom; this.prenom=prenom; } public String toString(){ return "className: "+ this.getClass().getName() + ' ' + nom + '|' + prenom; } public String getNom() { return nom; } public boolean equals(Object arg0) { if(! (arg0 instanceof Client))return false; Client cli=(Client)arg0; return (this.nom.equals(cli.nom) && this.prenom.equals(cli.prenom)); } public int hashCode() { return nom.hashCode()+prenom.hashCode(); } public String getPrenom() { return prenom; } }

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

//CompteCourant.java
package etape4; import java.text.DateFormat; import java.util.Date; import java.util.Locale; public class CompteCourant implements Compte { Integer ident; float solde; Date dateCreation; Client owner; CompteCourant(){ this(0,null); } CompteCourant(int ident , Client owner){ this.ident=new Integer(ident); this.owner=owner; dateCreation=new Date(); solde=0; } public Integer getIdent() { return ident; } public Date getDateCreation() { return dateCreation; } public float getSolde() { return solde; } public Client getOwner() { return owner; } public void crediter(float credit) { solde+=credit; } public void debiter(float debit) { solde-=debit; }

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

public String toString(){ DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE); return "className: " + this.getClass().getName() + ' ' + ident + '|' + owner.getNom() + '|' + owner.getPrenom() + '|' + dateFormat.format(dateCreation) + '|' + solde; } }

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

//CompteEpargne.java
package etape4; public class CompteEpargne extends CompteCourant { float taux; CompteEpargne(){ this(0,null,0); } CompteEpargne(int ident , super(ident,owner); this.taux=taux; } public float getTaux() { return taux; } public void setTaux(float taux) { this.taux = taux; } public String toString() { return super.toString()+ '|'+ taux; } Client owner , float taux){

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

//TestEtape4.java
package test; import utilitaire.Service; import etape4.Banque; import etape4.Client; public class TestEtape4 { public static void main(String[] args) { Service.message("test.TestEtape4",Service.T_AP); Service.ln(); Service.message("AtosBanque aprs cration",Service.T_AP); Banque banque= new Banque("AtosBanque"); Service.message(banque.toString()); Service.pause(); Service.message("Banque aprs cration de 2 clients et 4 comptes", Service.T_AP); Client cl1=banque.newClient("Burma","Nestor"); Client cl2=banque.newClient("Poppins","Marie"); banque.newCompteCourant(cl1); banque.newCompteCourant(cl1); banque.newCompteCourant(cl2); banque.newCompteEpargne(cl1,3f); Service.message(banque.toString()); Service.pause(); Service.message("Banque aprs mouvement sur compte 2 et 4", Service.T_AP); banque.crediterCompte(2,200); banque.crediterCompte(4,400); Service.message(banque.toString()); Service.pause(); Service.message("Liste des clients d'AtosBanque",Service.T_AP); Service.message(banque.iterClients()); Service.pause(); Service.message("Liste des comptes d'AtosBanque",Service.T_AP); Service.message(banque.iterComptes()); Service.pause(); Service.message("test.TestEtape4 TERMINE !",Service.T_AP); } }

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

test.TestEtape4
=============== AtosBanque aprs cration ========================= className: etape4.Banque AtosBanque ================ Frapper la touche <entree> pour continuer ================ Banque aprs cration de 2 clients et 4 comptes ================================================ className: etape4.Banque AtosBanque className: etape4.CompteCourant 2|Burma|Nestor|9 mars 2005|0.0 className: etape4.CompteEpargne 4|Burma|Nestor|9 mars 2005|0.0|3.0 className: etape4.CompteCourant 1|Burma|Nestor|9 mars 2005|0.0 className: etape4.CompteCourant 3|Poppins|Marie|9 mars 2005|0.0 ================ Frapper la touche <entree> pour continuer ================ Banque aprs mouvement sur compte 2 et 4 ======================================== className: etape4.Banque AtosBanque className: etape4.CompteCourant 2|Burma|Nestor|9 mars 2005|200.0 className: etape4.CompteEpargne 4|Burma|Nestor|9 mars 2005|400.0|3.0 className: etape4.CompteCourant 1|Burma|Nestor|9 mars 2005|0.0 className: etape4.CompteCourant 3|Poppins|Marie|9 mars 2005|0.0 ================ Frapper la touche <entree> pour continuer ================ Liste des clients d'AtosBanque ============================== className: etape4.Client Poppins|Marie className: etape4.Client Burma|Nestor ================ Frapper la touche <entree> pour continuer ================ Liste des comptes d'AtosBanque ============================== className: etape4.CompteCourant className: etape4.CompteEpargne className: etape4.CompteCourant className: etape4.CompteCourant

2|Burma|Nestor|9 mars 2005|200.0 4|Burma|Nestor|9 mars 2005|400.0|3.0 1|Burma|Nestor|9 mars 2005|0.0 3|Poppins|Marie|9 mars 2005|0.0

================ Frapper la touche <entree> pour continuer ================ test.TestEtape4 TERMINE ! =========================

exemple : Agrgation, fabrique, collection interface : Compte classes : Service, TestEtape4, Client, CompteCourant, CompteEpargne, Banque

Etape4

La persistance

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

54

EO05 V3.1

La persistance

La persistance

On peut distinguer 2 types d'objets:


Les objets qui offrent des services
Un distributeur bancaire: retrait et/ou dpt d'espce , consultation de compte Un tel objet n'a pas besoin de persister quelque part une fois les services rendus Un compte bancaire: Quand je crdite mon compte (instance d'une classe Compte), il faut que mon compte (objet rel) se souvienne de cette opration

Les objets qui reprsentent des objets du monde rel

La persistance consiste faire persister l'tat d'un objet:


dans des Fichiers; dans des BDD Relationnelles; dans des BDD Objets.
EO05 V3.1

55

La persistance

La persistance, plusieurs solutions


Dans une base de donnes relationelle, en faisant correspondre un objet une ligne d'une table (Mapping Objet Relationnel) et en utilisant l'api JDBC. Utilisation de JDO (persistance transparente) pour un objet vers une source de donnes transactionnelle ( Fichier XML, SGBD O , SGBDR ). Utilisation d'un Framework de persistance (Hibernate, ). Utilisation de la srialization.

56

EO05 V3.1

Exemple Etape5

Persistance par srialization


Interface:
etape5.Compte java.io.Serializable

Classes:
etape4.Banque etape4.Client etape4.CompteCourant etape4.CompteEpargne test.TestEtape4 utilitaire.Service java.io.ObjectInputStream java.io.ObjectOutputStream

57

EO05 V3.1

//Banque.java
package etape5; import import import import import import import import import import import java.io.FileInputStream; java.io.FileOutputStream; java.io.ObjectInputStream; java.io.ObjectOutputStream; java.io.Serializable; java.util.Collection; java.util.HashSet; java.util.Iterator; java.util.Map; java.util.Set; java.util.TreeMap;

public class Banque implements Serializable { /** * */ Extension par dfaut pour les fichiers de sauvegarde de Banque public static final String banqueExt="serial"; String nom; Map comptes ; int maxCompteIdent=0; Set clients ; public Banque (String nom){ this.nom=nom; comptes=new TreeMap(); clients=new HashSet(); } public Compte getCompte(int ident){ return (Compte)comptes.get(new Integer(ident)); } public Client newClient(String nom,String prenom){ Client client=new Client(nom,prenom); if (clients.contains(client)) return client; else {clients.add(client); return client; } } public Compte newCompteCourant(Client owner){ maxCompteIdent++; Compte compte = new CompteCourant(maxCompteIdent,owner); comptes.put(compte.getIdent(),compte); return compte; }

exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque

Etape5

public Compte newCompteEpargne(Client owner,float taux){ maxCompteIdent++; Compte compte = new CompteEpargne(maxCompteIdent,owner,taux); comptes.put(compte.getIdent(),compte); return compte; } public void removeCompte(int ident){ comptes.remove(new Integer(ident)); } public void crediterCompte(int ident,float credit){ Compte compte = getCompte(ident); if(compte != null ) compte.crediter(credit); }

public void debiterCompte(int ident,float debit){ crediterCompte(ident, - debit ); } public String toString() { StringBuffer s = new StringBuffer("className: " + this.getClass().getName() + ' ' + nom); Collection coll = comptes.values(); Iterator iterator=coll.iterator(); while (iterator.hasNext()){ s.append("\n\t").append(iterator.next()); } return s.toString(); } public Iterator iterComptes(){ Collection coll = comptes.values(); Iterator iterator=coll.iterator(); return iterator; } public Iterator iterClients(){ return clients.iterator(); } public void save(String fileName){ try { FileOutputStream fos; fos = new FileOutputStream(fileName); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(this); } catch (Exception e) { } }
exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque Etape5

e.printStackTrace();

public Banque load(String fileName){ try { FileInputStream fis; fis = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fis); Banque b = (Banque) ois.readObject(); this.nom =b.nom; this.clients=b.clients; this.comptes=b.comptes; this.maxCompteIdent=b.maxCompteIdent; return this; } catch (Exception e) { e.printStackTrace(); return null; } } }

exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque

Etape5

//Client.java
package etape5; import java.io.Serializable; public class Client implements Serializable { String nom; String prenom; Client(){ this("Inconnu","Inconnu"); } Client(String nom, String prenom){ this.nom=nom; this.prenom=prenom; } public String toString(){ return "className: "+ this.getClass().getName() + ' ' + nom + '|' + prenom; } public String getNom() { return nom; } public boolean equals(Object arg0) { if(! (arg0 instanceof Client))return false; Client cli=(Client)arg0; return (this.nom.equals(cli.nom) && this.prenom.equals(cli.prenom)); } public int hashCode() { return nom.hashCode()+prenom.hashCode(); } public String getPrenom() { return prenom; }

exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque

Etape5

//Compte.java
package etape5; import java.io.Serializable; import java.util.Date; public interface Compte extends Serializable { Integer getIdent(); Date getDateCreation(); float getSolde(); Client getOwner(); void crediter(float credit); void debiter(float debit); }

exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque

Etape5

//TestEtape5.java
package test; import utilitaire.Service; import etape5.Banque; import etape5.Client;

public class TestEtape5 { public static void main(String[] args) { Service.message("test.TestEtape5",Service.T_AP); Service.ln(); Banque banque1= new Banque("AtosBanque"); Client cl1=banque1.newClient("Burma","Nestor"); Client cl2=banque1.newClient("Poppins","Marie"); banque1.newCompteCourant(cl1); banque1.newCompteCourant(cl1); banque1.newCompteCourant(cl2); banque1.newCompteEpargne(cl1,3f); banque1.crediterCompte(2,200); banque1.crediterCompte(4,400); Service.message("AtosBanque avant sauvegarde",Service.T_AP); Service.message(banque1.toString()); Service.pause(); banque1.save("banqueAtos.serial"); Service.message("banque2 aprs cration",Service.T_AP); Banque banque2=new Banque("Banque2"); Service.message(banque2.toString()); Service.pause(); banque2=banque2.load("banqueAtos.serial"); Service.message("banque2 aprs rcupration",Service.T_AP); Service.message(banque2.toString()); Service.pause(); Service.message("test.TestEtape5 TERMINE !",Service.T_AP); } }

exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque

Etape5

test.TestEtape5
=============== AtosBanque avant sauvegarde =========================== className: etape5.Banque AtosBanque className: etape5.CompteCourant className: etape5.CompteCourant className: etape5.CompteCourant className: etape5.CompteEpargne

1|Burma|Nestor|9 mars 2005|0.0 2|Burma|Nestor|9 mars 2005|200.0 3|Poppins|Marie|9 mars 2005|0.0 4|Burma|Nestor|9 mars 2005|400.0|3.0

================ Frapper la touche <entree> pour continuer ================ banque2 aprs cration ====================== className: etape5.Banque Banque2 ================ Frapper la touche <entree> pour continuer ================ banque2 aprs rcupration ========================== className: etape5.Banque AtosBanque className: etape5.CompteCourant className: etape5.CompteCourant className: etape5.CompteCourant className: etape5.CompteEpargne

1|Burma|Nestor|9 mars 2005|0.0 2|Burma|Nestor|9 mars 2005|200.0 3|Poppins|Marie|9 mars 2005|0.0 4|Burma|Nestor|9 mars 2005|400.0|3.0

================ Frapper la touche <entree> pour continuer ================ test.TestEtape5 TERMINE ! =========================

exemple : Persistance par serialization interface : Compte, Serializable classes : Service, TestEtape5, Client, CompteCourant, CompteEpargne, Banque

Etape5

Gestion d'interface Homme/Machine

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

58

EO05 V3.1

Gestion d'interface Homme/Machine

Gestion d'interface Homme/Machine


Architecture container/composant. Programmation vnementielle et dlgation. Le modle MVC.

59

EO05 V3.1

Architecture container/composant

60

EO05 V3.1

Architecture container/composant

61

EO05 V3.1

Programmation vnementielle et dlgation

62

EO05 V3.1

Le modle MVC
Le modle MVC dcompose les applications en trois parties.
Modle
Gre le comportement et les donnes de l'application. (rgles mtier). Renseigne sur son tat ( get). Modifie son tat ( set ). Prsente l'tat du modle. Rcupre les actions de l'utilisateur. Agit sur le modle. Prvient la/les vue(s) que le modle a chang d'tat.

Vue

Contrleur

Le modle ne dpend ni de la vue ni du contrleur. Cela permet de le tester et de le rutiliser facilement. Il y une bonne sparation de la logique de l'interface utilisateur (contrleur + vue(s) de l'interface mtier (modle).

63

EO05 V3.1

Le modle MVC

Ici, le modle est passif puisqu'il ne connat ni le contrleur , ni les vues. Il n'y a donc pas de possibilit de modifier les vues lorsque le modle est modifi par des objets diffrents du contrleur. On respecte ainsi une sparation nette entre le modle et les vues. Si le modle a nanmoins besoin d'informer les vues sans pour autant dpendre d'elles, on introduit le modle "Observer" . L'on a alors un modle actif ( le cours d'une action varie dans le temps, par exemple ).
EO05 V3.1

64

Le modle MVC avec Observer et Observable

Les vues implmentent Observer et s'enregistrent auprs du modle via addObserver( ) . Sur le schma, le modle dlgue cet enregistrement un Observable. Quand le modle change, il prvient son observable (notifyObserver() ) qui prvient les vues. Les vues interrogent alors le modle pour s'actualiser. Le modle est devenu actif, mais reste toujours indpendant des vues. Si ncessaire, le contrleur peut lui aussi tre notifi par le modle s'il implmente Observer et s'enregistre auprs du modle.
EO05 V3.1

65

Exemple Etape6

Utilisation de Banque dans un client graphique


Interface: etape6.Compte java.io.Serializable Classes: etape6.gui.AppliBanque etape6.gui.CadreAppliBanque etape6.Banque etape6.Client etape6.CompteCourant etape6.CompteEpargne test.TestEtape6 utilitaire.Service

66

EO05 V3.1

//TestEtape6.java
package test; import etape6.gui.AppliBanque; import utilitaire.Service; public class TestEtape6 { public static void main(String[] args) { Service.message("test.TestEtape6",Service.T_AP); AppliBanque appliBanque= new AppliBanque(); Service.message("test.TestEtape6 TERMINE !",Service.T_AV); } }

exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque

Etape6

//AppliBanque.java
package etape6.gui; import javax.swing.UIManager; import java.awt.*; public class AppliBanque { boolean packFrame = false; //Construire l'application public AppliBanque() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } CadreAppliBanque frame = new CadreAppliBanque(); //Valider les cadres ayant des tailles prdfinies //Compacter les cadres ayant des infos de taille prfres - ex. depuis leur disposition if (packFrame) { frame.pack(); } else { frame.validate(); } //Centrer la fentre Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); frameSize.height=(int)(screenSize.height*0.95); frameSize.width=(int)(screenSize.width*0.95); frame.setSize(frameSize); frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); } }

exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque

Etape6

//CadreAppliBanque.java
package etape6.gui; import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import java.awt.AWTEvent; java.awt.Color; java.awt.Dimension; java.awt.GridBagConstraints; java.awt.GridBagLayout; java.awt.Insets; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.awt.event.WindowEvent; java.io.File; java.util.Iterator; java.util.Properties; javax.swing.BorderFactory; javax.swing.JButton; javax.swing.JComboBox; javax.swing.JFileChooser; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JMenu; javax.swing.JMenuBar; javax.swing.JMenuItem; javax.swing.JPanel; javax.swing.JScrollPane; javax.swing.JTextField; javax.swing.JTextPane; javax.swing.SwingConstants; javax.swing.filechooser.FileFilter; utilitaire.Service; etape6.Banque; etape6.Client; etape6.Compte; etape6.CompteEpargne;

public class CadreAppliBanque extends JFrame { // code ajout Banque banque=new Banque("Banque par dfaut"); Client client; //client courant Compte compte; //compte courant ActionListener actClient; ActionListener actCompte; // La partie graphique t faite avec JBuilder 10 JPanel contentPane; JMenuBar jMenuBar1 = new JMenuBar(); JMenu jMenuFile = new JMenu(); JMenuItem jMenuFileExit = new JMenuItem(); JMenu jMenuHelp = new JMenu();
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

JMenuItem jMenuHelpAbout = new JMenuItem(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); JLabel jLabel3 = new JLabel(); JLabel jLabel4 = new JLabel(); JLabel jLabel5 = new JLabel(); JLabel jLabel6 = new JLabel(); JTextField jTextFieldNom = new JTextField(); JTextField jTextFieldPrenom = new JTextField(); JTextField jTextFieldTaux = new JTextField(); JTextField jTextFieldIdent = new JTextField(); JTextField jTextFieldSolde = new JTextField(); JComboBox jComboBoxClient = new JComboBox(); JComboBox jComboBoxCompte = new JComboBox(); JLabel jLabel7 = new JLabel(); JLabel jLabel8 = new JLabel(); JButton jButtonNClient = new JButton(); JButton jButtonNCompteCourant = new JButton(); JButton jButtonNCompteEpargne = new JButton(); JButton jButtonCrediter = new JButton(); JButton jButtonDebiter = new JButton(); JLabel jLabel9 = new JLabel(); JLabel jLabel10 = new JLabel(); JScrollPane jScrollPane1 = new JScrollPane(); JTextPane jTextPane1 = new JTextPane(); GridBagLayout gridBagLayout1 = new GridBagLayout(); JButton jButtonBanque = new JButton(); JMenuItem jMenuFileCharger = new JMenuItem(); JMenuItem jMenuFileSauver = new JMenuItem(); JTextField jTextFieldTaux1 = new JTextField(); JLabel jLabel11 = new JLabel(); JTextField jTextFieldMontant = new JTextField(); JLabel jLabel12 = new JLabel(); //Construire le cadre public CadreAppliBanque() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } }

exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque

Etape6

//Initialiser le composant private void jbInit() throws Exception { contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(gridBagLayout1); this.setSize(new Dimension(579, 345)); this.setTitle("test.TestEtape6 AppliBanque"); jMenuFile.setText("Fichier"); jMenuFileExit.setText("Quitter"); jMenuFileExit.addActionListener(new Cadre1_jMenuFileExit_ActionAdapter(this)); jMenuHelp.setText("Aide"); jMenuHelpAbout.setText("A propos"); jMenuHelpAbout.addActionListener(new Cadre1_jMenuHelpAbout_ActionAdapter(this)); jLabel1.setFont(new java.awt.Font("Dialog", 1, 11)); jLabel1.setBorder(BorderFactory.createLineBorder(Color.black)); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jLabel1.setText("Client"); jLabel2.setFont(new java.awt.Font("Dialog", 1, 11)); jLabel2.setBorder(BorderFactory.createLineBorder(Color.black)); jLabel2.setVerifyInputWhenFocusTarget(true); jLabel2.setHorizontalAlignment(SwingConstants.CENTER); jLabel2.setText("Compte"); jLabel3.setFont(new java.awt.Font("Dialog", 1, 11)); jLabel3.setBorder(BorderFactory.createLineBorder(Color.black)); jLabel3.setToolTipText(""); jLabel3.setDisplayedMnemonic('0'); jLabel3.setHorizontalAlignment(SwingConstants.CENTER); jLabel3.setText("Slection"); jLabel4.setToolTipText(""); jLabel4.setHorizontalAlignment(SwingConstants.RIGHT); jLabel4.setText("nom"); jLabel5.setToolTipText(""); jLabel5.setHorizontalAlignment(SwingConstants.RIGHT); jLabel5.setText("prenom"); jLabel6.setToolTipText(""); jLabel6.setHorizontalAlignment(SwingConstants.RIGHT); jLabel6.setText("taux"); jLabel7.setHorizontalAlignment(SwingConstants.RIGHT); jLabel7.setText("numro"); jLabel8.setRequestFocusEnabled(true); jLabel8.setToolTipText(""); jLabel8.setHorizontalAlignment(SwingConstants.RIGHT); jLabel8.setText("solde"); jButtonNClient.setText("nouveau client"); jButtonNClient.addActionListener(new Cadre1_jButtonNClient_actionAdapter(this)); jButtonNCompteCourant.setText("nouveau compte courant"); jButtonNCompteCourant.addActionListener(new Cadre1_jButtonNCompteCourant_actionAdapter(this)); jButtonNCompteCourant.setToolTipText(""); jButtonNCompteEpargne.setText("nouveau compte pargne"); jButtonNCompteEpargne.addActionListener(new Cadre1_jButtonNCompteEpargne_actionAdapter(this));
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

jButtonNCompteEpargne.setToolTipText(""); jButtonCrediter.setText("crditer"); jButtonCrediter.addActionListener(new Cadre1_jButtonCrediter_actionAdapter(this)); jButtonDebiter.setToolTipText(""); jButtonDebiter.setText("dbiter"); jButtonDebiter.addActionListener(new Cadre1_jButtonDebiter_actionAdapter(this)); jLabel9.setToolTipText(""); jLabel9.setText("clients"); jLabel10.setToolTipText(""); jLabel10.setText("comptes"); jButtonBanque.setText("Banque"); jButtonBanque.addActionListener(new Cadre1_jButtonBanque_actionAdapter(this)); jButtonBanque.setToolTipText(""); jMenuFileCharger.setText("Charger"); jMenuFileCharger.addActionListener(new Cadre1_jMenuFileCharger_actionAdapter(this)); jMenuFileSauver.setText("Sauver"); jMenuFileSauver.addActionListener(new Cadre1_jMenuFileSauver_actionAdapter(this)); jTextFieldTaux1.setPreferredSize(new Dimension(57, 21)); jTextFieldTaux1.setRequestFocusEnabled(true); jTextFieldTaux1.setText(""); jTextFieldTaux1.setScrollOffset(0); jTextFieldTaux1.setEditable(false); jLabel11.setRequestFocusEnabled(true); jLabel11.setHorizontalAlignment(SwingConstants.RIGHT); jLabel11.setText("taux"); jTextFieldMontant.setRequestFocusEnabled(true); jTextFieldMontant.setToolTipText(""); jTextFieldMontant.setText(""); jTextFieldMontant.setScrollOffset(0); jLabel12.setToolTipText(""); jLabel12.setHorizontalAlignment(SwingConstants.RIGHT); jLabel12.setText("montant"); jTextFieldNom.setSelectionStart(0); jTextFieldNom.setText(""); jTextFieldPrenom.setText(""); jTextFieldTaux.setSelectionStart(0); jTextFieldTaux.setText(""); jTextFieldIdent.setText(""); jTextFieldIdent.setEditable(false); jTextFieldSolde.setText(""); jTextFieldSolde.setEditable(false); jMenuFile.add(jMenuFileExit); jMenuFile.add(jMenuFileCharger); jMenuFile.add(jMenuFileSauver); jMenuHelp.add(jMenuHelpAbout); jMenuBar1.add(jMenuFile); jMenuBar1.add(jMenuHelp); contentPane.add(jLabel1,new GridBagConstraints(0, 0, 2, 1, 0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 3, 0, 0), 127, 3));
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

contentPane.add(jLabel5,new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 32, 0, 0), 28, 6)); contentPane.add(jLabel6,new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(9, 32, 0, 0), 43, 6)); contentPane.add(jTextFieldNom,new GridBagConstraints(1,1,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 7, -3)); contentPane.add(jTextFieldPrenom,new GridBagConstraints(1,2,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 0, 0, 0), 7, 0)); contentPane.add(jTextFieldTaux,new GridBagConstraints(1,6,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 0, 0, 0), 7, 0)); contentPane.add(jButtonNClient,new GridBagConstraints(0,3,2,2,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 9, 0, 0), 50, -4)); contentPane.add(jButtonNCompteCourant, new GridBagConstraints(0,5,2,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 9, 0, 0), 0, -4)); contentPane.add(jButtonNCompteEpargne, new GridBagConstraints(0,7,2,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 3, 0, 0), 4, -4)); contentPane.add(jLabel2,new GridBagConstraints(2,0,2,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(7, 19, 0, 0), 115, 3)); contentPane.add(jLabel3,new GridBagConstraints(4,0,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(7, 11, 0, 63), 108, 3)); contentPane.add(jButtonCrediter,new GridBagConstraints(3,6,1,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 4, -5)); contentPane.add(jButtonDebiter,new GridBagConstraints(3,7,1,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 8, -5)); contentPane.add(jLabel4,new GridBagConstraints(0,1,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 32, 0, 0), 44, 3)); contentPane.add(jTextFieldIdent,new GridBagConstraints(3,1,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 0, 0, 0), 11, -3)); contentPane.add(jLabel7,new GridBagConstraints(2,1,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 59, 0, 0), 15, 3)); contentPane.add(jTextFieldSolde,new GridBagConstraints(3,2,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 0, 0, 0), 15, 0)); contentPane.add(jLabel8,new GridBagConstraints(2,2,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 52, 0, 0), 30, 6)); contentPane.add(jComboBoxClient,new GridBagConstraints(4,2,1,1,1.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

new Insets(8, 11, 0, 63), 135, 0)); contentPane.add(jComboBoxCompte,new GridBagConstraints(4,5,1,1,1.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 11, 0, 63), 135, -2)); contentPane.add(jLabel10,new GridBagConstraints(4,3,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 14, 0, 143), 13, 0)); contentPane.add(jLabel9,new GridBagConstraints(4,1,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 17, 0, 147), 15, 0)); contentPane.add(jScrollPane1,new GridBagConstraints(0,8,5,1,1.0,1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(9, 3, 0, 11), 498, 149)); contentPane.add(jButtonBanque,new GridBagConstraints(4,7,1,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 11, 0, 63), 86, 0)); jScrollPane1.getViewport().add(jTextPane1, null); contentPane.add(jTextFieldTaux1,new GridBagConstraints(3,3,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 0, 0, 0), 15, 0)); contentPane.add(jLabel11,new GridBagConstraints(2,3,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 52, 0, 0), 30, 6)); contentPane.add(jTextFieldMontant,new GridBagConstraints(3,5,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(6, 0, 0, 0), 15, 0)); contentPane.add(jLabel12,new GridBagConstraints(2,5,1,1,0.0,0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 52, 0, 0), 30, 6)); this.setJMenuBar(jMenuBar1); this.initJComboBox(); } //Effacement de tous les JTextField public void clearAllFields(){ this.clearFieldsClient(); this.clearFieldsCompte(); } //Effacement des JTextField partie Client public void clearFieldsClient(){ this.jTextFieldNom.setText(""); this.jTextFieldPrenom.setText(""); this.jTextFieldTaux.setText(""); } //Effacement des JTextField partie Compte public void clearFieldsCompte(){ this.jTextFieldIdent.setText(""); this.jTextFieldSolde.setText(""); this.jTextFieldTaux1.setText(""); this.jTextFieldMontant.setText(""); } //Initialisation des JComboBox public void initJComboBox(){ actClient=new Cadre1_jComboBoxClient_actionAdapter(this); actCompte=new Cadre1_jComboBoxCompte_actionAdapter(this);
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

} //Ajout des items dans les JComboBox public void addItemJComboBox(){ this.jComboBoxClient.removeActionListener(actClient); this.jComboBoxClient.removeAllItems(); for (Iterator iter = banque.iterClients(); iter.hasNext();) { Client element = (Client) iter.next(); this.jComboBoxClient.addItem(element); } this.jComboBoxClient.addActionListener(actClient); this.jComboBoxCompte.removeActionListener(actCompte); this.jComboBoxCompte.removeAllItems(); for (Iterator iter = banque.iterComptes(); iter.hasNext();) { Compte element = (Compte) iter.next(); this.jComboBoxCompte.addItem(element); } this.jComboBoxCompte.addActionListener(actCompte); } //Opration Fichier | Quitter effectue public void jMenuFileExit_actionPerformed(ActionEvent e) { System.exit(0); } //Opration Aide | A propos effectue public void jMenuHelpAbout_actionPerformed(ActionEvent e) { } //Redfinie, ainsi nous pouvons sortir quand la fentre est ferme protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { jMenuFileExit_actionPerformed(null); } } // Cration d'un Client void jButtonNClient_actionPerformed(ActionEvent e) { this.client=this.banque.newClient(this.jTextFieldNom.getText(), this.jTextFieldPrenom.getText()); this.clearFieldsCompte(); this.jComboBoxClient.addItem(client); this.jTextPane1.setText("Client cr: "+client.toString()); } // Cration d'un CompteCourant void jButtonNCompteCourant_actionPerformed(ActionEvent e) { compte=banque.newCompteCourant(client); this.clearFieldsCompte(); this.jTextFieldIdent.setText(""+compte.getIdent()); this.jTextFieldSolde.setText(""+compte.getSolde());
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

jComboBoxCompte.addActionListener(actCompte); jComboBoxClient.addActionListener(actClient);

this.jComboBoxCompte.addItem(compte); this.jTextPane1.setText("Compte Courant cr: "+compte.toString());

// Cration d'un CompteEpargne void jButtonNCompteEpargne_actionPerformed(ActionEvent e) { float taux; try{ taux=Float.parseFloat(this.jTextFieldTaux.getText()); } catch(NumberFormatException ex){ this.jTextFieldTaux.setText("?"); this.jTextFieldTaux.setBackground(Color.YELLOW); this.jTextFieldTaux.requestFocus(); return; } this.jTextFieldTaux.setBackground(Color.WHITE); this.jTextFieldTaux.setText(""); compte=banque.newCompteEpargne(client,taux); this.clearFieldsCompte(); this.jTextFieldIdent.setText(""+compte.getIdent()); this.jTextFieldSolde.setText(""+compte.getSolde()); this.jTextFieldTaux1.setText(""+((CompteEpargne)compte).getTaux()); this.jComboBoxCompte.addItem(compte); this.jTextPane1.setText("Compte Epargne cr: "+compte.toString()); } // Crediter un Compte void jButtonCrediter_actionPerformed(ActionEvent e) { float montant; try{ montant=Float.parseFloat(this.jTextFieldMontant.getText()); } catch(NumberFormatException ex){ this.jTextFieldMontant.setText("?"); this.jTextFieldMontant.setBackground(Color.YELLOW); this.jTextFieldMontant.requestFocus(); return; } this.jTextFieldMontant.setBackground(Color.WHITE); this.jTextFieldMontant.setText(""); compte.crediter(montant); this.jTextFieldSolde.setText(""+compte.getSolde()); this.jTextPane1.setText("Compte crdit: "+compte.toString()); } //Debiter un Compte void jButtonDebiter_actionPerformed(ActionEvent e) { float montant; try{ montant=Float.parseFloat(this.jTextFieldMontant.getText()); } catch(NumberFormatException ex){ this.jTextFieldMontant.setText("?"); this.jTextFieldMontant.setBackground(Color.YELLOW);
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

10

} this.jTextFieldMontant.setBackground(Color.WHITE); this.jTextFieldMontant.setText(""); compte.debiter(montant); this.jTextFieldSolde.setText(""+compte.getSolde()); this.jTextPane1.setText("Compte dbit: "+compte.toString()); } //Slectionner un Client void jComboBoxClient_actionPerformed(ActionEvent e) { this.clearAllFields(); client = (Client)this.jComboBoxClient.getSelectedItem(); this.jTextFieldNom.setText(client.getNom()); this.jTextFieldPrenom.setText(client.getPrenom()); this.jTextPane1.setText(this.client.toString()); } //Slectionner un Compte (et un client indirectement ...) void jComboBoxCompte_actionPerformed(ActionEvent e) { this.clearAllFields(); compte = (Compte)this.jComboBoxCompte.getSelectedItem(); client = compte.getOwner(); this.jTextFieldNom.setText(client.getNom()); this.jTextFieldPrenom.setText(client.getPrenom()); this.jTextFieldIdent.setText(""+compte.getIdent()); this.jTextFieldSolde.setText(""+compte.getSolde()); if (compte instanceof CompteEpargne) this.jTextFieldTaux1.setText(""+((CompteEpargne)compte).getTaux());

this.jTextFieldMontant.requestFocus(); return;

this.jTextPane1.setText(this.jComboBoxCompte.getSelectedItem().toString()); } //Afficher la banque void jButtonBanque_actionPerformed(ActionEvent e) { this.jTextPane1.setText(this.banque.toString()); } //Charger une Banque void jMenuFileCharger_actionPerformed(ActionEvent e) { Properties prop= System.getProperties(); String s = System.getProperties().getProperty("user.dir"); JFileChooser chooser = new JFileChooser(s); chooser.setFileFilter(new FileBanqueFilter()); int returnVal=chooser.showOpenDialog(null); if(returnVal==JFileChooser.APPROVE_OPTION){ File file=chooser.getSelectedFile(); String fileName=file.getName(); banque.load(fileName); addItemJComboBox();
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

11

this.jTextPane1.setText("fichier de chargement: "+ fileName); } } // Sauver la banque par serialization void jMenuFileSauver_actionPerformed(ActionEvent e) { String s = System.getProperties().getProperty("user.dir"); JFileChooser chooser = new JFileChooser(s); chooser.setFileFilter(new FileBanqueFilter()); int returnVal=chooser.showSaveDialog(null); if(returnVal==JFileChooser.APPROVE_OPTION){ File file=chooser.getSelectedFile(); String fileName=file.getName(); banque.save(fileName); this.jTextPane1.setText("fichier de sauvegarde: "+ fileName); } } }

exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque

Etape6

12

// Classes annexes implmentant les Listeners class Cadre1_jMenuFileExit_ActionAdapter implements ActionListener { CadreAppliBanque adaptee; Cadre1_jMenuFileExit_ActionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jMenuFileExit_actionPerformed(e); }

class Cadre1_jMenuHelpAbout_ActionAdapter implements ActionListener { CadreAppliBanque adaptee; Cadre1_jMenuHelpAbout_ActionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jMenuHelpAbout_actionPerformed(e); } } class Cadre1_jButtonNClient_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jButtonNClient_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButtonNClient_actionPerformed(e); }

class Cadre1_jButtonNCompteCourant_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jButtonNCompteCourant_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButtonNCompteCourant_actionPerformed(e); } } class Cadre1_jButtonNCompteEpargne_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jButtonNCompteEpargne_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) {
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

13

adaptee.jButtonNCompteEpargne_actionPerformed(e); } }

class Cadre1_jButtonCrediter_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jButtonCrediter_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButtonCrediter_actionPerformed(e); } } class Cadre1_jButtonDebiter_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jButtonDebiter_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButtonDebiter_actionPerformed(e); }

class Cadre1_jComboBoxClient_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jComboBoxClient_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jComboBoxClient_actionPerformed(e); }

class Cadre1_jComboBoxCompte_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jComboBoxCompte_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jComboBoxCompte_actionPerformed(e); } } class Cadre1_jButtonBanque_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee;
exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque Etape6

14

Cadre1_jButtonBanque_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButtonBanque_actionPerformed(e); }

class Cadre1_jMenuFileCharger_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jMenuFileCharger_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jMenuFileCharger_actionPerformed(e); } } class Cadre1_jMenuFileSauver_actionAdapter implements java.awt.event.ActionListener { CadreAppliBanque adaptee; Cadre1_jMenuFileSauver_actionAdapter(CadreAppliBanque adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jMenuFileSauver_actionPerformed(e); }

} // Class Filtre pour JFileChooser class FileBanqueFilter extends FileFilter{

public boolean accept(File arg0) { if (arg0.isDirectory()) return true; String extension = Service.getExtension(arg0); if((extension!=null )&& extension.equals(Banque.banqueExt))return true; } public String getDescription() { return "Banque srialise"; } } else return false;

exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque

Etape6

15

exemple : Utilisation de Banque et dans une application graphique interface : Compte, Serializable classes : Service, TestEtape6, Client, CompteCourant, CompteEpargne, Banque classes ihm : AppliBanque, CadreAppliBanque

Etape6

16

Application multi tiers

1. 2. 3. 4. 5. 6. 7. 8. 9.

Les langages traditionnels. Les objets et leurs modles. Types et interfaces. Spcialisation d'une classe (hritage). Le polymorphisme. La gnricit. La persistance. Gestion d'interface Homme/Machine. Application multi tiers.

67

EO05 V3.1

Application multi tiers

Application deux tiers Client Serveur


L'application est sur le poste client. Difficult de dploiement.

Serveur de donnes Sgbd

68

EO05 V3.1

Application multi tiers

Application multi tiers


3 tiers:
Clients lgers ( navigateur web); Une couche prsentation et application (serveur web + applicatif); Une couche persistance (sgbd ).

Plus de problme de dploiement. Possibilit de modifier facilement une couche.

Client lger Navigateur web

Serveur de prsentation et applicatif

Serveur de stockage Sgbd

69

EO05 V3.1

Application multi tiers

Application multi tiers


Les 3 tiers se dclinent en n tiers
Apache, Tomcat Serveur Web et Servlet Html Servlet Jsp javaBean Jboss, Websphere, Weblogic Serveur application EJB Mapping Objet Relationnel Serveur de stockage SGBD CICS LDAP

Client web

EJB

Client java

70

EO05 V3.1

Application console

Architecture d'une application simple


Crer et/ou rcuprer les classes ncessaires. En java crer une classe Application avec la mthode: public static void main(String [ ] args ) En C++ crer un excutable contenant la fonction: int main( int argc , char ** argv) Dans cette mthode/fonction instancier les classes, puis envoyer des messages aux objets

71

EO05 V3.1

Glossaire:
Accesseur C'est une mthode particulire permettant de rcuprer un attribut d'objet. Son nom commence par get Ex: public String getNom( ) {} Un attribut caractrise une donne d'un objet. Il possde un nom, un type et parfois une valeur par dfaut. Ex: String nom; Une classe est un modle d'objets de mmes caractristiques. (donnes et comportements). Le mot classe doit tre compris dans le sens de classification. Une classe permettra la cration d'objets (instances) par le mcanisme d'instanciation. C'est une mthode particulire (de mme nom que la classe) qui est appele lors de la cration (instanciation) d'objets. Son rle est d'initialiser correctement un objet. Il peut y avoir plusieurs constructeurs grce au mcanisme de surcharge. En C++ si la classe possde des attributs de type pointeur il a un rle supplmentaire d'allocation d'espace mmoire. C'est une mthode particulire qui est appele juste avant qu'un objet soit dtruit. En C++ il est obligatoire si la classe possde des attributs de type pointeur. Il a alors un rle de librateur d'espace mmoire.

Attribut

Classe

Constructeur

Destructeur

DownCasting Conversion vers le bas. Cette conversion est toujours explicite. Il sagit de convertir une rfrence (ou un pointeur) dune superclasse vers une rfrence (ou un pointeur) de classe drive afin de pouvoir lui appliquer une mthode non dfinie dans la superclasse. Un downCasting peut russir la compilation et chouer lexecution si lon rfrence un objet dune classe diffrente de la classe dans laquelle on a downcast. Ex : Mammifere m = new MammifereVolant ( ) // UpCasting implicite MammifereVolant mv = (MammifereVolant) m // DownCasting explicite mv.vole( ) ; // Cest ok la conversion tait lgale. MammifereTerrestre mt= (MammifereTerrestre) m ; mt.vole( ) ; // Echec la conversion tait illgale Encapsulation Une classe contient la dfinition complte d'un type d'objet (donnes et comportement). On parle donc d'encapsulation. Il est en outre possible de masquer l'exterieur de la classe certains attributs et mthodes. Gnricit Dans un algorithme gnrique les arguments sont des types de donnes (classes) et non des variables (objets). Ex: Dfinir une pile qui puisse convenir n'importe quel type.

glossaire

Garbage collector C'est un mcanisme qui permet de rcuprer automatiquement l'espace mmoire occup par des objets qui ne sont plus rfrencs. Java utilise un gc. En C++ cette charge est laisse au programmeur. Hritage C'est le mcanisme qui permet partir d'une classe (super classe ou classe mre) de dfinir une classe plus spcifique (sous classe ou classe drive). Cela permet en outre une bonne factorisation (rutilisation) du code. Ex: Classe CompteBanquaire que l'on drive en Classe CompteEpargne, CompteRemunere Un interface est un ensemble de mthodes abstraites. Une classe implmentant un interface s'engage offrir l'ensemble des mthodes de l'interface. En java le concept d'interface permet l'implmentation de la gnricit. L'instance (objet) est la ralisation d'une classe. Ex: La classe Voiture. L'instance maVoiture de type Voiture. Ce sont les instances qui sont manipules dans les applications. Une mthode dfinit un comportement d'un objet un message prcis. Ex: Window fentre; . fentre.close( ); C'est grce au code de la mthode close que l'objet fentre sait ragir au message close. C'est une mthode particulire permettant de modifier un attribut d'objet. Son nom commence par set Ex: public void setAge( int age) {} voir Instance C'est un mcanisme permettant de sauvegarder (faire persister) l'tat d'un objet en dehors de l'application et de le rcuprer ultrieurement.

Interface

Instance

Mthode

Mutateur

Objet Persistance

Polymorphisme C'est la possibilit pour des objets diffrents de rpondre " leur manire " des messages identiques. C'est aussi la possibilit de rfrencer de faon identique des objets diffrents. Grce ce mcanisme les objets se comportent comme ce qu'ils sont et non comme ce qu'ils paraissent tre. En Java le polymorphisme est naturel, En C++ on l'implmente grce aux fonctions virtuelles. Ex: Un ours et un lion peuvent tre vus comme deux mammifres. Si on leur envoie le message dormir ils vont chacun dormir leur faon. Redfinition Srialisation C'est la possibilit de changer le comportement d'une mthode de super classe dans une classe drive. C'est l'action de sauver un objet en partie ou en totalit dans un fichier, une base de donnes ou un flux . Le mcanisme inverse se nomme la dsrialisation.

glossaire b

Surcharge Template UpCasting

C'est la possibilit d'avoir plusieurs mthodes de mmes noms (avec des arguments diffrents) dans une classe. C'est un modle de classe. (Une classe est un modle d'objet). C'est la faon d'implmenter la gnricit en C++. Conversion vers le haut. Une rfrence (ou pointeur) de classe drive est automatiquement convertie vers une rfrence (ou pointeur) de sa superclasse. Cette conversion est gnralement implicite.

glossaire