Académique Documents
Professionnel Documents
Culture Documents
Notes de Cours
Conception avancée des logiciels
Cours 4
Design Patterns
(Patrons de conception)
Présenté par
Mr KHELIFA N.
Rappel
Objet
Presenter() Ensigne ()
Classe
Classe est une description d’un ensemble d’objets qui
partagent les mêmes caractéristiques (propriétés,
opérations,...) et la même sémantique
e3:Etudiant
Id: 11129
Nom: Salim e4:Etudiant Etudiant
e1:Etudiant Prénom: amir
Parcours: licence Id: 11130 Id: int
Id: 11121 Année etude: 3 Nom: Kaddour Nom: string
Nom: ahmed Prénom: hillal Prénom: string
Prénom: Okba CalculerMoy() Parcours: licence Parcours: string
Parcours: licence Revisercours() Année etude: 3 Année etude: int
Année etude: 3
CalculerMoy() CalculerMoy()
e2:Etudiant
CalculerMoy() Revisercours() Revisercours()
Revisercours()
Id: 11125
Nom: kamal
Prénom: khaled
Parcours: licence
Année etude: 3
CalculerMoy()
Revisercours()
Définitions
Quelques concepts sur les classes
◦ Attribut : Propriété nommée d’un classificateur qui
décrit une plage de valeur que les instance d’un
classificateur peuvent prendre
les interfaces sont des éléments de modèle qui définissent des ensembles
d'opérations que d'autres éléments de modèle, tels que des classes ou des
composants, doivent implémenter.
Un élément de modèle d'implémentation réalise une interface en remplaçant
chacune des opérations que l'interface déclare.
Vous pouvez utiliser des interfaces dans les diagrammes de classes et les
diagrammes de composants pour spécifier un contrat entre l'interface et le
discriminant qui réalise l'interface
Exemple
Héritage vs Composition
Problème :
Modéliser le fait qu’il y a des voitures bleues, des voitures
rouges et des voitures vertes
Solution 1 : Héritage
◦ Créer une classe abstraite Voiture
◦ Créer 3 classes VoitureBleue, VoitureRouge et VoitureVerte qui héritent de
Voiture
Solution 2 : Composition
Créer une classe Voiture et une classe Couleur
Créer une association (composition) entre Voiture et Couleur
Héritage vs Délégation
Problème :
◦ Appeler dans une classe B une opération op() d’une classe A ?
Solution 1 : Héritage
◦ Faire hériter B de A
◦ op() peut être appelée depuis n’importe quelle instance de B
Solution 2 : Délégation
◦ Ajouter dans B un attribut a de type A (Ajouter une association de B vers A)
◦ a.op() peut être appelée depuis n’importe quelle instance de B
Concepts de base
Couplage
Cohésion
Couplage
Mesure de l’interdépendance entre deux
modules.
Un ensemble de modules est faiblement couplé si les
liens de dépendances entre les modules sont peu
nombreux.
Un faible couplage est précurseur…
D’un bon découpage du système: les éléments qui
dépendent les uns des autres ne sont pas «éparpillés» à
travers les modules du système.
D’une facilité de maintenance: une modification dans un
module affecte éventuellement un nombre restreint d’autres
modules. Nombre de révisions réduites…
Couplage
Cohésion
Un module est fortement cohésif si tous ses éléments
sont destinés et sont essentiels à la réalisation d’une
tâche commune unique.
Concept 2
Le comportement peut changer en cours
d’exécution
Les classes sont plus focalisées sur une tâche
Réduction des dépendances d’implémentation
Patron de conception
Un patron (pattern)
Définition
1
Un pattern est une solution à un problème dans un contexte.
Définition 2
Un patron décrit à la fois un problème qui se produit très
fréquemment dans l’environnement et l’architecture de la
solution à ce problème de telle façon que l’on puisse utiliser
cette solution des milliers de fois sans jamais l’adapter deux
fois de la même manière.
Les patrons ne sont pas
Une panacée
Catégories de Patterns
Architectural Patterns
– Schémas d’organisation structurelle de logiciels (pipes, filters,
brokers, blackboard, MVC, …)
• Design Patterns
– Caractéristiques clés d’une structure de conception commune
à plusieurs applications,
– Portée plus limitée que les « architectural patterns »
• Idioms ou coding patterns
– Solution liée à un langage particulier
• Anti-patterns
– Mauvaise solution ou comment sortir d ’une mauvaise
solution
• Organizational patterns
– Schémas d’organisation de tout ce qui entoure le
développement d’un logiciel (humains…..)
Patrons de base
Un patron de conception
(design pattern)
Solutions abstraites qui fonctionnent bien dans différents contextes
Pizza commanderPizza() {
Pizza pizza = new Pizza();
pizza.preparer();
pizza.cuire();
pizza.couper();
pizza.emballer();
return pizza;
}}
Exemple(suite)
Mais un seul type de pizza ne suffit pas...
Pizza commanderPizza(String type) {
Maintenant, nous transmettons le
Pizza pizza; type de pizza à commanderPizza().
if (type.equals(“fromage”)) {
pizza = new PizzaFromage();
} else if (type.equals(“grecque”) {
pizza = new PizzaGrecque();
} else if (type.equals(“poivrons”) {
pizza = new PizzaPoivrons();
}
pizza.preparer();
pizza.cuire();
pizza.couper();
pizza.emballer();
return pizza;
}
Exemple(suite)
Pizza commanderPizza(String type) {
Pizza pizza;
Ce code n’est PAS
if (type.equals(“fromage”)) { fermé à la modification.
pizza = new PizzaFromage(); Si vous changez votre
} else if (type.equals(“grecque”) { carte, vous devrez
pizza = new PizzaGrecque(); reprendre ce code et le
} else if (type.equals(“poivrons”) { modifier
pizza = new PizzaPoivrons();
} else if (type.equals(“fruitsDeMer”) {
pizza = new PizzaFruitsDeMer();
} else if (type.equals(“vegetarienne”) {
pizza = new PizzaVegetarienne();
}
pizza.preparer();
pizza.cuire(); Voici ce qui ne devrait
pizza.couper(); pas changer.
pizza.emballer();
return pizza;
}
Exemple(suite)
Pizza commanderPizza(String type) {
Pizza pizza; if (type.equals(“fromage”)) {
pizza = new PizzaFromage();
} else if (type.equals(“poivrons”) {
pizza = new PizzaPoivrons();
} else if (type.equals(“fruitsDeMer”) {
pizza = new PizzaFruitsDeMer();
} else if (type.equals(“vegetarienne”) {
pizza = new PizzaVegetarienne();
}
pizza.preparer();
pizza.cuire();
pizza.couper(); nous plaçons ce code dans un
objet dont la seule responsabilité
pizza.emballer(); est de créer des pizzas.
Si un autre objet a besoin qu’une
return pizza; Nous avons un nom pour pizza soit créée, c’est
ce nouvel objet : à cet objet qu’il faut s’adresser.
} nous l’appelons une
Fabrique.
Exemple(suite)
public class SimpleFabriqueDePizzas {
creerPizza, C’est la
méthode que tous
public Pizza creerPizza(String type) {` les clients utiliseront
Pizza pizza = null; pour créer de
if (type.equals(“fromage”)) { nouvelles instances.
Et voici le produit de la
fabrique :Nous avons défini
Pizza comme une
le client de la fabrique. classe abstraite
Pizzeria passe maintenant par la avec quelques
SimpleFabriqueDePizzas pour implémentations utiles
obtenir des instances de pizzas qui peuvent être
redéfinies
La fabriqueConcret
implémente la méthode
Créer (), la méthode qui
crée réellement les produits