Un objet B (Opérateur) est associé à un objet A (Calcul).

Un objet B (Opérateur) est associé à un objet A (Calcul) et son rôle est identifié sur le diagramme.


Par un setter :
class Calcul{
private Operateur op;
public setOperateur(Operateur op){
this.op = op;
}
public getOperateur(){return op;}
}Par le constructeur :
class Calcul{
private Operateur op;
public Calcul(Operateur op){
this.op = op;
}
public getOperateur(){return op;}
}Au moment de l’instanciation :
class Calcul{
private Operateur op;
public Calcul(){
op = new Operateur();
}
public getOperateur(){return op;}
}Deux objets sont liés l’un à l’autre:
chaque instance possède une référence vers l’autre instance.

Ce code ne fonctionne pas :
void init(){
Moteur moteur ;
Vehicule vehicule;
//Vehicule n'est pas instancié:
moteur = new Moteur(vehicule);
vehicule = new Vehicule(moteur);
}void init(){
Moteur moteur ;
Vehicule vehicule;
moteur = new Moteur();
vehicule = new Vehicule(moteur);
moteur.setVehicule(vehicule);
}void init(){
Moteur moteur ;
Vehicule vehicule;
moteur = new Moteur();
vehicule = new Vehicule();
moteur.setVehicule(vehicule);
vehicule.setMoteur(moteur);
}Il est possible de représenter une relation de dépendance entre deux classes sans qu’il y ait une association telle que représentée précédemment.
La classe principale LancerCalculs utilise la classe Calcul

La classe principale LancerCalculs crée au moins une instance de la classe Addition

Peut aussi être noté:

Une agrégation consiste en un assemblage d’objets:
Ces objets sont liés par une relation d’inclusion :


Les relations entre agrégat et parties peuvent être:

La destruction de l’agrégat n’implique pas la destruction des parties

public class TableChevet {
Livre livreMatin;
Livre livreSoir ;
public void afficherTitres() {
System.out.println("Livre posé: "+livreMatin.titre);
System.out.println("Livre posé: "+livreSoir.titre);
}
public void setLivreSoir(Livre livreSoir) {
this.livreSoir = livreSoir;
}
public void setLivreMatin(Livre livreMatin) {
this.livreMatin = livreMatin;
}
public void finalize() {
System.out.println("La table de chevet est vendue");
}
}
public class Personne {
TableChevet tableChevet ;
Livre aube = new Livre("Aube");
Livre crepuscule = new Livre("Crepuscule");
Personne(){
tableChevet = new TableChevet();
tableChevet.setLivreMatin(aube);
tableChevet.setLivreSoir(crepuscule);
}
public void vendreTableChevet() {
tableChevet = null;
}
public void citerLivres() {
System.out.println("Mon livre du matin: "+ aube.titre);
System.out.println("Mon livre du soir: "+crepuscule.titre);
}
}
public class LireMatinEtSoir {
public static void main(String[] args) {
Personne joey = new Personne();
joey.citerLivres();
joey.tableChevet.afficherTitres();
joey.vendreTableChevet();
nettoyerObjets();
System.out.println(joey.tableChevet);
joey.citerLivres();
}
public static void nettoyerObjets() {
System.out.println("Ramasse-miettes");
try {
System.gc();
Thread.sleep(100);
} catch (InterruptedException e) {
System.err.println(e);
}
}
}Une composition consiste en un assemblage d’objets:
Ces objets sont liés par une relation dans laquelle :


Les relations entre composite et composants sont structurelles

La destruction de la composition implique la destruction des composants

import java.util.ArrayList;
import java.util.List;
public class Livre {
String titre;
List<Page> pages = new ArrayList<>();
Livre(String t){
titre = t;
pages.add(new Page(1, this));
pages.add(new Page(2, this));
pages.add(new Page(3, this));
}
public void finalize() {
System.out.println("Le livre "+titre+" est brûlé.");
}
}
public class Page {
int numero;
Livre livre ;
Page(int num, Livre l){
numero = num;
livre = l;
}
public void finalize() {
System.out.println("La page "
+numero+" du livre "
+livre.titre+" brûle.");
}
}
public class Personne {
Livre aube = new Livre("Aube");
Livre crepuscule = new Livre("Crepuscule");
Personne(){
}
public void brulerLivres() {
System.out.println("Je brûle mes livres");
aube = null;
crepuscule = null;
}
public void citerLivres() {
if (aube != null) {
System.out.println("Mon livre du matin: "+ aube);
}else {
System.out.println("Pas de livre du matin");
}
if (crepuscule != null) {
System.out.println("Mon livre du soir: "+ crepuscule);
}else {
System.out.println("Pas de livre du soir");
}
}
}
public class BrulerLivres {
public static void main(String[] args) {
Personne joey = new Personne();
joey.brulerLivres();
nettoyerObjets();
joey.citerLivres();
}
public static void nettoyerObjets() {
System.out.println("Ramasse-miettes");
try {
System.gc();
Thread.sleep(100);
} catch (InterruptedException e) {
System.err.println(e);
}
}
}Déléguer c’est faire réaliser le travail par un tiers (un délégué)
La délégation :


public class Calcul {
private int resultat ;
private int op1 ;
private int op2;
private Operateur operateur;
Calcul(Operateur lOperateur){
operateur = lOperateur;
}
/**
* Accesseur: donne accès à la valeur
* d'op1
* @return op1
*/
public int getOp1() {
return op1;
}
public void setOp1(int a) {
calculer(a, op2);
}
public void setOp2(int b) {
calculer(op1, b);
}
public void calculer(int a, int b) {
op1 = a;
op2 = b;
resultat = operateur.appliquer(op1, op2);
}
/**
* Accesseur: donne accès à la valeur
* d'op2
* @return op2
*/
public int getOp2() {
return op2;
}
public int getResultat() {
return resultat;
}
public String getInformation() {
return "Le resultat de "+operateur.getType()
+ " avec " + op1 + " et " + op2
+ " est " + resultat;
}
}
public class OperateurAddition implements Operateur {
@Override
public int appliquer(int a, int b) {
return a + b;
}
@Override
public String getType() {
return "addition";
}
}Classe principale LancerCalculs
public class LancerCalculs {
public static void main(String[] args) {
Calcul calcul1 = new Calcul(new OperateurAddition());
calcul1.calculer(3, 5);
System.out.println(calcul1.getInformation());
Calcul calcul2 = new Calcul(new OperateurSoustraction());
calcul2.calculer(4, 5);
System.out.println(calcul2.getInformation());
Calcul calcul3 = new Calcul(new OperateurMultiplication());
calcul3.calculer(3, 5);
calcul3.setOp1(7);
System.out.println(calcul3.getInformation());
calcul3.setOp2(6);
System.out.println(calcul3.getInformation());
System.out.println(calcul3.getResultat());
}
}Compléter le diagramme suivant:

public class OperateurSoustraction extends OperateurAddition {
@Override
public int appliquer(int a, int b) {
return super.appliquer(a, -b);
}
@Override
public String getType() {
return "soustraction";
}
}La délégation hybride :


public class Calcul {
private int resultat ;
private int op1 ;
private int op2;
private Operateur operateur;
Calcul(Operateur lOperateur){
operateur = lOperateur;
}
/**
* Accesseur: donne accès à la valeur
* d'op1
* @return op1
*/
public int getOp1() {
return op1;
}
public void setOp1(int a) {
calculer(a, op2);
}
public void setOp2(int b) {
calculer(op1, b);
}
public void calculer(int a, int b) {
op1 = a;
op2 = b;
resultat = operateur.appliquer(this);
}
/**
* Accesseur: donne accès à la valeur
* d'op2
* @return op2
*/
public int getOp2() {
return op2;
}
public int getResultat() {
return resultat;
}
public String getInformation() {
return "Le resultat de "+operateur.getType()
+ " avec " + op1 + " et " + op2
+ " est " + resultat;
}
}
public class OperateurAddition implements Operateur {
@Override
public int appliquer(Calcul c) {
return c.getOp1() + c.getOp2();
}
@Override
public String getType() {
return "addition";
}
}
public class OperateurSoustraction implements Operateur {
@Override
public int appliquer(Calcul c) {
return c.getOp1() - c.getOp2();
}
@Override
public String getType() {
return "soustraction";
}
}Elle reste idendique à la version précédente.
La classe Lettre permet de représenter les lettres d’un alphabet. Chaque lettre possède un nom.
A chaque instance est associée :
Symbole correspondant à sa représentation en majusculeminusculeA, B et C.LettreLa classe Chiffre permet de représenter les symboles de numération. Chaque chiffre est associé:
0, 1 et 9.ChiffreLa classe Mot représente un ensemble composée de lettres.
La classe Nombre représente un ensemble composée de chiffres.
Un ensemble représente une collection d’objets non ordonnés.

public class EntiersRelatifs {
Set<String> mots = new TreeSet<>(); //ou une classe implémentant Set
}Objets ordonnés dont le nombre est fixé.

Objets ordonnés dont le nombre peut varier.

public class Classeur {
private List<Feuille> feuilles = new ArrayList<>();
// ou LinkedList ou classe implémentant List
}Collection ordonnée pouvant contenir plusieurs fois la même occurence d’une même valeur.
Au Clair De La Lune : {Do, Do, Do, Ré, Mi, Ré, Do, Mi, Ré, Ré, Do}

public class Melodie {
private List<Note> notes = new ArrayList<>();
// ou LinkedList ou classe implémentant List
}public class Classeur {
private List<Feuille> feuilles ;
public Classeur() {
feuilles = new ArrayList<>();
}
public Classeur(List<Feuille> feuilles) {
this.feuilles = feuilles;
}
public Classeur(Feuille... feuilles) {
this.feuilles = new ArrayList<>(Arrays.asList(feuilles));
}
}public class Classeur {
private List<Feuille> feuilles ;
//...
public void addFeuille(Feuille p) {
feuilles.add(p);
}
public void addFeuilles(Collection<Feuille> feuilles) {
this.feuilles.addAll(feuilles);
}
public void addFeuilles(Feuille... feuilles) {
this.feuilles.addAll(Arrays.asList(feuilles));
}
}public class Classeur {
private List<Feuille> feuilles ;
//...
public Feuille getFeuille(int index) {
return feuilles.get(index);
}
public Iterator<Feuille> getFeuilles() {
return feuilles.iterator();
}
}Créer une classe Alphabet. Cette classe permet d’associer des symboles (‘A’, ‘b’, ‘Z’) sous la forme d’un ensemble (déterminer lequel est pertinent). Ces symboles seront représentés par la classe Lettre.
Chaque symbole a une représentation minuscule ou majuscule.
Alphabet, Lettre et Symbole.A, à Z.LettreUn mot est une séquence de lettres. La classe Mot représente cette séquence.
Mot et Lettre.chat, le, lait, boit.

Dans un glossaire, on associe à chaque mot une définition dans une discipline donnée.
Le glossaire sera ici organisé comme suit:
Le dictionnaire sera ici organisé comme suit: