52
Introduction SOLID Design Patterns Principes de conception et Design Patterns Conception Orient´ ee Objet Jean-Christophe Routier Licence mention Informatique Universit´ e Lille 1 Universit´ e Lille 1 - Licence Informatique Conception Orient´ ee Objet 1

Conception Orient´ee Objet - FIL Lille 1 · Introduction SOLID Design Patterns Principes de conception et Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence

Embed Size (px)

Citation preview

Introduction SOLID Design Patterns

Principes de conception et Design Patterns

Conception Orientee Objet

Jean-Christophe RoutierLicence mention Informatique

Universite Lille 1

Universite Lille 1 - Licence Informatique Conception Orientee Objet 1

Introduction SOLID Design Patterns

Vie d’un source...

1 joli, pur, “beau”2 une premiere “heresie”3 de plus en plus d’horreurs4 toujours plus d’horreurs5 des horreurs partout

Consequences :1 de moins en moins maintenable et evolutif2 design submerge par les “horreurs”3 effet “spaghetti”

Universite Lille 1 - Licence Informatique Conception Orientee Objet 2

Introduction SOLID Design Patterns

Symptomes

I les degradations du design sont liees aux modifications desspecifications,

I ces modifications sont “a faire vite” et par d’autres que les designersoriginaux⇒ “ca marche” mais sans respect du design initial⇒ corruption du design (avec effet amplifie au fur et a mesure)

I mais les modifs sont inevitables↪→ la conception/design doit permettre ces modifications (les amortir :“firewalls”)

I les degradations sont dues aux dependances et a l’architecture desdependances

Universite Lille 1 - Licence Informatique Conception Orientee Objet 3

Introduction SOLID Design Patterns

SOLID

5 principes regroupes par Robert C. Martin

I Single Responsibility PrincipleI Open-Closed PrincipleI Liskov Substitution PrincipleI Interface Segregation PrincipleI Dependency Inversion Principle.

ces principes se renforcent mutuellement

Universite Lille 1 - Licence Informatique Conception Orientee Objet 4

Introduction SOLID Design Patterns

(credits images http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/)

Universite Lille 1 - Licence Informatique Conception Orientee Objet 5

Introduction SOLID Design Patterns

https: // sites. google. com/ site/ unclebobconsultingllc/ getting-a-solid-start

What do I mean by “Principle”?The SOLID principles are not rules. They are not laws. They are not perfect truths.The are statements on the order of “An apple a day keeps the doctor away.” This is agood principle, it is good advice, but it’s not a pure truth, nor is it a rule. (...)These principles are heuristics. They are common-sense solutions to commonproblems.

Following the rules on the paint can won’t teach you how to paintThis is an important point. Principles will not turn a bad programmer into a goodprogrammer. Principles have to be applied with judgement. If they are applied byrote it is just as bad as if they are not applied at all.

So how do I get started?“There is no royal road to Geometry” Euclid once said to a King who wanted theshort version. Don’t expect to skim through the papers, or thumb through the books,and come out with any real knowledge. If you want to learn these principles wellenough to be able to apply them, then you have to study them. (...)Practice, practice, practice, practice. Be prepared to make lots of mistakes.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 6

Introduction SOLID Design Patterns

Open Closed Principle

Universite Lille 1 - Licence Informatique Conception Orientee Objet 7

Introduction SOLID Design Patterns

Liskov Substitution Principle

Universite Lille 1 - Licence Informatique Conception Orientee Objet 8

Introduction SOLID Design Patterns

Le Principe de substitution de Liskov

B. Liskov et J. Wing (dans “Family Values: A Behavioral Notion of Subtyping”)

Principe de SubstitutionSi q(x) est une propriete demontrable pour tout objet x de type T , alorsq(y) est vraie pour tout objet y de type S tel que S est un sous-type de T .

autrement dit (R.C. Martin) :

Principe de Substitution en COOLes sous-classes doivent pouvoir remplacer leur classe de baseLes methodes qui utilisent des objets d’une classe doivent pouvoir utiliser“inconsciemment” des objets derives de cette classe

Universite Lille 1 - Licence Informatique Conception Orientee Objet 9

Introduction SOLID Design Patterns

Exemple1(exemple inspire de http://blogs.developpeur.org/fathi/archive/2011/12/09/lsp-liskov-substitution-principle.aspx)

public enum DuckState { FLY, SWIM, REST; }

public class Duck {private DuckState state = DuckState.REST;/** positionne DuckState a DuckState.FLY */public void fly(){

this.state = DuckState.FLY;}public DuckState getState() {

return this.state;}

}

public class ElectricDuck extends Duck {public boolean switchOn = false;public void fly() { // surcharge

if(this.switchOn)super.fly();

}public void switchOn() {

this.switchOn = true;}

}

public class DuckClientClass {public void makeThemFly(List<? extends Duck> myList) {

int nbFlyingDucks = 0;for (Duck duck : myList) {

duck.fly();if (duck.getState() == DuckState.FLY)

nbFlyingDucks++;}if(nbFlyingDucks != myList.size()) {

throw new RuntimeException("not all ducks fly!");}

}

public static void main(String[] args){List<Duck> myList = new ArrayList<Duck>();myList.add(new Duck()); myList.add(new Duck());new DuckClientClass().makeThemFly(myList);myList.add(new ElectricDuck());new DuckClientClass().makeThemFly(myList));

}}

Universite Lille 1 - Licence Informatique Conception Orientee Objet 10

Introduction SOLID Design Patterns

public class DuckClientClass{public void makeThemFly(List<? extends Duck> myList ) {

int nbFlyingDucks = 0;for (Duck duck : myList) {

if (duck instanceof ElectricDuck) {((ElectricDuck) duck).switchOn();

}duck.fly();if (duck.getState() == DuckState.FLY)

nbFlyingDucks++;}if(nbFlyingDucks != myList.size()) {

throw new RuntimeException("Some ducks not flying");}

}

Open Closed Principle ?

Duck et ElectricDuck n’ont sans doute rien en commun...

(a moins peut-etre d’une interface canFly ?)

Universite Lille 1 - Licence Informatique Conception Orientee Objet 11

Introduction SOLID Design Patterns

Legitimite de l’heritage ?(exemple inspire de http://stackoverflow.com/questions/10778354/how-can-i-avoid-breaking-liskov-substitution-principle-lsp)

public class Cat {public void scratch(Animal a) {

System.out.println("I scratch "+a);}public void bite(Animal a) {

System.out.println("I bite "+a);}

}

On veut maintenant prendre en compte des chats sans griffe...public class ScratchlessCat extends Cat {

public void scratch(Animal a) { // surcharge// ne fait rien

}}

ScratchlessCat ne respecte plus la semantique de sa super-classe Cat.

Et si on introduit des chats qui ne mordent pas ?Et des chats qui ne mordent ni ne griffent ?

Universite Lille 1 - Licence Informatique Conception Orientee Objet 12

Introduction SOLID Design Patterns

Utiliser la compositionSi un chat peut griffer, c’est parce qu’il a des griffes...

utiliser la composition

public class Claw {public void scratch(Object scratcher, Animal a) {

System.out.println(scratcher+ " scratches "+ a);}

}

public class Cat {private Claw claw;public Cat(Claw claw) { // avec claw==null si << scratchless >>

this.claw = claw;}public final void scratch(Animal a) {

if (this.claw != null) {this.claw.scratch(this,a);

}}

}

probleme de la legitimite de l’heritage...

Universite Lille 1 - Licence Informatique Conception Orientee Objet 13

Introduction SOLID Design Patterns

Exemple 3(exemple inspire http://www.javacodegeeks.com/2011/11/solid-liskov-substitution-principle.html)

public class Bird {public void fly(){ ... }public void eat(){ ... }

}public class Crow extends Bird { }public class Ostrich extends Bird {public void fly() {throw new UnsupportedOperationException();

}}

public FlyingBirdClient {public void letTheBirdsFly(List<? extends Bird> birdList) {for (Bird b : birdList) {

b.fly();}

}

public static void main(String[] args){List<Bird> birdList = new ArrayList<Bird>();birdList.add(new Bird());birdList.add(new Crow());birdList.add(new Ostrich());new BirdTest().letTheBirdsFly(birdList);

}}

Solution ?|| public class Bird {| public void eat() { ... }| }|| public class FlightBird extends Bird {| public void fly() { ... }| }| public class Crow extends FlightBird { }|| public class NonFlightBird extends Bird { }|| public class Ostrich extends NonFlightBird { }| et| public FlyingBirdClient {| ...letTheBirdsFly(List<? extends FlightBird> birdList) {

Universite Lille 1 - Licence Informatique Conception Orientee Objet 14

Introduction SOLID Design Patterns

Exemple 4(exemple inspire http://www.cs.sjsu.edu/∼pearce/cs251b/principles/liskov2.htm)

public interface Cheese {}public class Cheddar implements Cheese {}public class Maroilles implements Cheese {}

public class CheeseSandwich {protected Cheese filling;public void setFilling(Cheese c) { this.filling = c; }public Cheese getFilling() { return this.filling; }

}

public class CheddarSandwich extends CheeseSandwich {public void setFilling(Cheddar c) { // ce n’est pas une surcharge !

this.filling = c;}public Cheddar getFilling() { return this.filling; }public Cheddar getFilling() { return this.filling; } // pas possible

}

public class ClientClass {public static void main(String[] args) {

CheddarSandwich s = new CheddarSandwich();s.setFilling(new Cheddar());Cheddar c = (Cheddar) s.getFilling(); // Comment eviter le cast ?s.setFilling(new Maroilles()); // que se passe-t-il ?c = (Cheddar) s.getFilling(); // ???compile mais ClassCastException...

}}

Universite Lille 1 - Licence Informatique Conception Orientee Objet 15

Introduction SOLID Design Patterns

public interface Cheese {}public class Cheddar implements Cheese {}public class Maroilles implements Cheese {}

public class CheeseSandwich <T extends Cheese> {protected T filling;public void setFilling(T c) { this.filling = c; }public T getFilling() { return this.filling; }

}

ou

|| public class Sandwich <T> {| protected T filling;| public void setFilling(T c) { this.filling = c; }| public T getFilling() { return this.filling; }| }| public class CheeseSandwich <T extends Cheese>| extends Sandwich<T>{| }|

public class CheddarSandwich extends CheeseSandwich<Cheddar> {// setFilling(T c) devient ‘‘naturellement’’ setFilling(Cheddar c)

}

public class ClientClass {public static void main(String[] args) {CheddarSandwich s = new CheddarSandwich();s.setFilling(new Cheddar());Cheddar c = s.getFilling(); // plus besoin de casts.setFilling(new Maroilles()); // ne compile pas

}}

Universite Lille 1 - Licence Informatique Conception Orientee Objet 16

Introduction SOLID Design Patterns

Les carres ne sont pas des rectangles(exemple inspire http://www.cs.sjsu.edu/∼earce/cs251b/principles/liskov2.htm)

Square is-a Rectangle ?public class Rectangle {

protected int height;protected int width;public void setHeight(int h) { this.height = h; }public int getHeight() { return this.height; }public void setWidth(int h) { this.width = h; }public int getWidth() { return this.width; }public int area() {

return this.height*this.width;}

}

public class Square extends Rectangle {public void setSide(int s) {this.setHeight(s);this.setWidth(s);

}public int getSide() { return this.getHeight(); }public static void main(String[] args) {Square s = new Square();s.setWidth(10);s.setHeight(20);S.o.p(s.area());

}}

|| public class ClientClass {| public void useRectangle(Rectangle rect,| int h, int w) {| rect.setHeight(h);| rect.setWidth(w);| }|||| public static void main(String[] args) {| ClientClass client = new ClientClass();| Rectangle r1 = new Rectangle();| client.useRectangle(r1, 10,20);| Rectangle r2 = new Square();| client.useRectangle(r2, 10, 20);| }| }|

Universite Lille 1 - Licence Informatique Conception Orientee Objet 17

Introduction SOLID Design Patterns

Violation de contrat

Et surcharger setWidth (et setHeight) dans Square ?

public class Square extends Rectangle {public void setWidth(int s) { // plus besoin de setSide ?

this.width = s;this.height = s;

}...

}

Le contrat de setWidth de Rectangle est de modifier la largeur sans modifierla hauteur.

Le contrat n’est plus respecte par la surcharge.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 18

Introduction SOLID Design Patterns

public interface WithArea {public int area();

}public interface Quadrangle extends WithArea { }

public class Rectangle implements Quadrangle {protected int height;protected int width;public void setHeight(int h) { this.height = h; }public int getHeight() { return this.height; }public void setWidth(int h) { this.width = h; }public int getWidth() { return this.width; }public int area() {return this.height*this.width;

}}

public class Square implements Quadrangle {protected int side;public void setSide(int s) {this.side = s;

}public int getSide() { return this.side; }public int area() {return this.side*this.side;

}}

avec la compositionpublic class Square implements WithArea {protected Rectangle rect;public void setSide(int s) {

this.rect.setWidth(s);this.rect.setHeight(s);

}public int getSide() { return this.rect.getWidth(); }public int area() {

return this.rect.area();}

}Universite Lille 1 - Licence Informatique Conception Orientee Objet 19

Introduction SOLID Design Patterns

Le dilemme cercle/ellipse

(ou les cercles ne sont pas des ellipses...)

un Cercle est une Ellipse,est-ce que Circle is-a Ellipse

Ellipse : 2 foyers Circle : 1 seul centre

probleme avec setFoyers(Point p1, Point p2)

ne pas utiliser l’heritage juste pour factoriser du codeheritage =⇒ extension/specialisation

ce n’est pas le cas Cercle pour Ellipse,eventuellement utiliser la composition

Universite Lille 1 - Licence Informatique Conception Orientee Objet 20

Introduction SOLID Design Patterns

Single Responsibility Principle

Universite Lille 1 - Licence Informatique Conception Orientee Objet 21

Introduction SOLID Design Patterns

Single Responsibility Principle

Single Responsibility PrincipleUne classe ne doit avoir qu’une seule raison de changer.Une classe doit gerer une responsabilite unique.

I une classe ne devrait avoir qu’un seul objectif fonctionnelI eviter les dependances entre les responsabilites

Universite Lille 1 - Licence Informatique Conception Orientee Objet 22

Introduction SOLID Design Patterns

Exemple

public class Game {...public void play() {...Cell currentCell = ...;currentCell.consequence(dices);...

}

public class GooseCell extends BasicCell {...public int consequence(int diceThrow) { // 2 responsabilites

System.out.println(" reaches goose "+this.index+" and jumps to "+ (this.index+diceThrow));return this.index+diceThrow;

}}

2 responsabilites :I gerer la case Oie (calculer la “case consequence”)I afficher (et impose System.out)

Universite Lille 1 - Licence Informatique Conception Orientee Objet 23

Introduction SOLID Design Patterns

public class Game {...private StdOutAfficheur afficheur;public void play() {...Cell currentCell = ...;currentCell.consequence(dices);this.afficheur.affiche(currentCell.getMessage(dices));...

}

public class GooseCell extends BasicCell { // responsable de la gestion d’une case oie...public int consequence(int diceThrow) { // une seule responsabilitereturn this.index+diceThrow;

}public String getMessage(int diceThrow) {

return "reaches goose "+this.index+" and jumps to "+ (this.index+diceThrow);}

}

public class StdOutAfficheur { // responsable de l’affichage (sur stdout)public void affiche(String msg) {

System.out.println(msg);}

}

Universite Lille 1 - Licence Informatique Conception Orientee Objet 24

Introduction SOLID Design Patterns

Dependency Inversion Principle

Universite Lille 1 - Licence Informatique Conception Orientee Objet 25

Introduction SOLID Design Patterns

Dependency Inversion Principle

ou Inversion of Control

Dependre des abstractionsDependez des abstractions, ne dependez pas des concretisations.

1 Les modules de haut niveau ne doivent pas dependre de modules debas niveau. Tous deux doivent dependre d’abstractions

2 Les abstractions ne doivent pas dependre de details. Les detailsdoivent dependre d’abstractions.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 26

Introduction SOLID Design Patterns

Constat

I Generalement : le reutilisation des modules metiers (de haut niveau)n’est pas possible : ils sont construits sur les modules de bas niveaudirectement↪→ IHM, communication , etc.

logique del’application

Communication IHM

ProblemesI modification necessaire des modules de

haut niveau lorsque les bas niveaux sontmodifies

I reutilisation des modules de haut niveauindependamment des bas niveauximpossible=⇒ pas de reutilisation de la logique del’application en dehors du contextetechnique !

Universite Lille 1 - Licence Informatique Conception Orientee Objet 27

Introduction SOLID Design Patterns

Inversion des dependances

Principe d’inversion des dependancesLes modules de bas niveau doivent se conformer a des interfaces definies(car utilisees) par les modules de haut niveau.

Classe BClasse A

dépendance

dépendance

Classe A

Classe B

Interface I

logique de l’application

des interfaces

interfaces utilisées parla logique de l’application

Communication IHM

Communication IHM

implémentation

I Dependre d’interfaces et de classes abstraites plutot que de classes.I utiliser l’abstraction (encore et toujours... )

Universite Lille 1 - Licence Informatique Conception Orientee Objet 28

Introduction SOLID Design Patterns

Universite Lille 1 - Licence Informatique Conception Orientee Objet 29

Introduction SOLID Design Patterns

Universite Lille 1 - Licence Informatique Conception Orientee Objet 30

Introduction SOLID Design Patterns

public class Game {...private StdOutAfficheur afficheur; // dependancepublic void play() {

...Cell currentCell = ...;currentCell.consequence(dices);this.afficheur.affiche(currentCell.getMessage(dices));...

}

public class GooseCell extends BasicCell { // responsable de la gestion d’une case oie...public int consequence(int diceThrow) { // une seule responsabilitereturn this.index+diceThrow;

}public String getMessage(int diceThrow) {

return "reaches goose "+this.index+" and jumps to "+ (this.index+diceThrow);}

}

public class StdOutAfficheur { // responsable de l’affichage (sur stdout)public void affiche(String msg) {

System.out.println(msg);}

}

Universite Lille 1 - Licence Informatique Conception Orientee Objet 31

Introduction SOLID Design Patterns

public class Game {...private IAfficheur afficheur; // inversion de la dependancepublic void play() {...Cell currentCell = ...;currentCell.consequence(dices);this.afficheur.affiche(currentCell.getMessage(dices));...

}public void setAfficheur(IAfficheur monAfficheur) {

this.afficheur = monAfficheur;}

}

public interface IAfficheur {public void affiche(String msg);

}

public class StdOutAfficheur implements IAfficheur {public void affiche(String msg) {

System.out.println(msg);}

}

Universite Lille 1 - Licence Informatique Conception Orientee Objet 32

Introduction SOLID Design Patterns

Interface Segregation Principle

Universite Lille 1 - Licence Informatique Conception Orientee Objet 33

Introduction SOLID Design Patterns

Interface Segregation Principle (ISP)

Principe de separation des interfacesPlusieurs interfaces client specifiques valent mieux qu’une seule interfacegenerale. Les classes clientes ne doivent pas etre forcees de dependred’interfaces qu’elles n’utilisent pas.

I Eviter qu’un client voit une interface qui ne le concerne pasI Eviter que les evolutions dues a une partie du service aient un impact

sur un client alors qu’il n’est pas concerne

Universite Lille 1 - Licence Informatique Conception Orientee Objet 34

Introduction SOLID Design Patterns

Solution = Separation

N’offrir aux classes clientes qu’un acces limite...

+ méthodes pour C...

Client A1

Client A2

Client B1

Client B2

Client C1

Service

+ méthodes pour A...

+ méthodes pour B...

Client A1

Client A2

Client B1

Client B2

Client C1

Service A

Service B

Service C

Service

Universite Lille 1 - Licence Informatique Conception Orientee Objet 35

Introduction SOLID Design Patterns

Mise en œuvre

+ méthodes pour A...

Service A

+ méthodes pour B...

Service B

+ méthodes pour C...

Service C

Client B2Client B1Client A1 Client A2

Client C1

Service

I polymorphisme (+ upcast)(Java via interfaces)

Client B2Client B1Client A1 Client A2

Client C1

− s : Service

Service A

+ methodeA1()+ methodeA2()

− s : Service

Service B

+ methodeB()

− s : Service

Service C

+ methodeC()

Service

+ methodeA1()+ methodeA2()+ methodeB()+ methodeC()

this.s.methodeA1();

I utilisation du design patternAdapter

Universite Lille 1 - Licence Informatique Conception Orientee Objet 36

Introduction SOLID Design Patterns

Design Patterns

Proposer de bonnes solutions types a des problemes de conceptionrecurrents identifies.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 37

Introduction SOLID Design Patterns

MVC, l’“ancetre”

I Un pattern pour les IHM : decouplage IHM/applicatif.s’appuie sur les patterns Observer et Strategy.

I Plusieurs vues possibles pour une “meme donnee” =⇒ gerer lacoherence.

Souvent au niveau IHM, vue et controleur se confondent.

Applicable a d’autres domaines que IHM

Universite Lille 1 - Licence Informatique Conception Orientee Objet 38

Introduction SOLID Design Patterns

Patrons de conception

Design PatternsElements of reusable objected-oriented softwares

Addison Wesley

Gang of Four : E. Gamma, R. Helm, R. Johson, J. Vlissides

“Design Patterns. Tete la premiere.” Eric et Elisabeth Freeman

Universite Lille 1 - Licence Informatique Conception Orientee Objet 39

Introduction SOLID Design Patterns

Description d’un pattern

I Pattern Name and Classification Le nom du pattern, evoquesuccinctement l’esprit du pattern.

I Intent Une breve description qui repond aux questions suivantes :I Qu’est ce que le design pattern fait ?I Quels sont son objectif et sa justification ?I Quel probleme de conception particulier aborde-t-il ?

I Also Known As Autres noms connus pour le pattern, si il y en a.I Motivation Un scenario qui illustre un probleme de conception et

comment la structuration des classes et des objets dans ce pattern leresolvent. Le scenario devra aider a comprendre la description plusabstraite du pattern qui suit.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 40

Introduction SOLID Design Patterns

I ApplicabilityI Quelles sont les situations dans lesquelles le pattern peut etre applique ?I Quels sont les exemples de mauvaise conception que le pattern peut

attaquer ?I Comment reconnaıtre ces situations ?

I Structure Une representation graphique des classes dans le patternutilisant une notation basee sur l’Object Modeling Technique (OMT).

I Participants Les classes et/ou les objets qui participent au designpattern et leurs responsabilites.

I Collaborations Comment les participants collaborent pour tenir leursresponsabilites.

I ConsequencesI Comment le pattern satisfait-il ses objectifs ?I Quelles sont les consequences et resultats de l’usage du pattern ?I Quels points de la structure permet il de faire varier independamment ?

Universite Lille 1 - Licence Informatique Conception Orientee Objet 41

Introduction SOLID Design Patterns

I ImplementationI Quels pieges, astuces ou techniques devriez vous connaıtre pour

implementer ce pattern ?I Y a-t-il des problemes specifiques a un langage ?

I Sample Code Portions de code qui illustrent comment vous pourriezimplementer ce pattern.

I Known Uses Exemples d’utilisation du pattern trouves dans dessystemes reels.

I Related PatternsI Quels design patterns sont fortement lies a celui-ci et quelles sont les

differences importantes ?I Avec quels autres patterns celui-ci devrait il etre utilise ?

Universite Lille 1 - Licence Informatique Conception Orientee Objet 42

Introduction SOLID Design Patterns

Trois categories

I Creational Patterns Concernent l’abstraction du processusd’instanciation.

I Structural Patterns Concernent la composition des classes et objetspour obtenir des structures plus complexes.

I Behavioural Patterns Concernent les algorithmes et la repartition desreponsabilites entre les objets.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 43

Introduction SOLID Design Patterns

Creational Patterns

Abstraction du processus d’instanciation.

I Permettent de rendre le systeme independant du mode de creation desobjets qui le compose.

I Un creational pattern de classe utilise l’heritage pour faire varier laclasse instanciee.

I Un creational pattern d’objet delegue la creation a un autre objet.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 44

Introduction SOLID Design Patterns

I Abstract Factory Provide an interface for creating families of relatedor dependent objects without specifying their concrete classes.

I Builder Separate the construction of a complex object from itsrepresentation so that the same construction process can createdifferent representations.

I Factory Method Define an interface for creating an object, but letsubclasses decide which class to instantiate. Factory Method lets aclass defer instantiation to subclasses.

I Prototype Specify the kinds of objects to create using a prototypicalinstance, and create new objects by copying this prototype.

I Singleton Ensure a class only has one instance, and provide a globalpoint of access to it.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 45

Introduction SOLID Design Patterns

Structural Patterns

Composition de classes et objets pour obtenir des structures plus complexes.

I Un structural pattern de classe utilise l’heritage pour composer desinterfaces ou des implementations.

I Un structural pattern objet decrit comment composer des objets pourobtenir de nouvelles fonctionnalites, avec possibilite de faire evoluer lacomposition a l’execution.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 46

Introduction SOLID Design Patterns

Structural Patterns

I Adapter Convert the interface of a class into another interface clientsexpect. Adapter lets classes work together that couldn’t otherwisebecause of incompatible interfaces.

I Bridge Decouple an abstraction from its implementation so that thetwo can vary independently.

I Composite Compose objects into tree structures to representpart-whole hierarchies. Composite lets clients treat individual objectsand compositions of objects uniformly.

I Decorator Attach additional responsibilities to an object dynamically.Decorators provide a flexible alternative to subclassing for extendingfunctionality.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 47

Introduction SOLID Design Patterns

I Facade Provide a unified interface to a set of interfaces in asubsystem. Facade defines a higher-level interface that makes thesubsystem easier to use.

I Flyweight Use sharing to support large numbers of fine-grainedobjects efficiently.

I Proxy Provide a surrogate or placeholder for another object to controlaccess to it.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 48

Introduction SOLID Design Patterns

Behavioural Patterns

Algorithmes et repartition des responsabilites entre les objets.

I Decrivent egalement les patterns de communication entre classes etobjets : permettent donc de se degager du probleme du flots decontrole et de se concentrer sur les relations entre objets.

I Un behavioural pattern de classe utilise l’heritage pour distribuer lescomportements entre les classes.

I Un behavioural pattern objet utilise l’heritage plutot que lacomposition. Certains decrivent les cooperations entre objets, d’autresutilisent l’encapsulation du comportement dans un objet auquel sontdeleguees les requetes.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 49

Introduction SOLID Design Patterns

I Chain of Responsibility Avoid coupling the sender of a request to itsreceiver by giving more than one object a chance to handle therequest. Chain the receiving objects and pass the request along thechain until an object handles it.

I Command Encapsulate a request as an object, thereby letting youparameterize clients with different requests, queue or log requests, andsupport undoable operations.

I Interpreter Given a language, define a represention for its grammaralong with an interpreter that uses the representation to interpretsentences in the language.

I Iterator Provide a way to access the elements of an aggregate objectsequentially without exposing its underlying representation.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 50

Introduction SOLID Design Patterns

I Mediator Define an object that encapsulates how a set of objectsinteract. Mediator promotes loose coupling by keeping objects fromreferring to each other explicitly, and it lets you vary their interactionindependently.

I Memento Without violating encapsulation, capture and externalize anobject’s internal state so that the object can be restored to this statelater.

I Observer Define a one-to-many dependency between objects so thatwhen one object changes state, all its dependents are notified andupdated automatically.

I State Allow an object to alter its behavior when its internal statechanges. The object will appear to change its class.

I Strategy Define a family of algorithms, encapsulate each one, andmake them interchangeable. Strategy lets the algorithm varyindependently from clients that use it.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 51

Introduction SOLID Design Patterns

I Template Method Define the skeleton of an algorithm in anoperation, deferring some steps to subclasses. Template Method letssubclasses redefine certain steps of an algorithm without changing thealgorithm’s structure.

I Visitor Represent an operation to be performed on the elements of anobject structure. Visitor lets you define a new operation withoutchanging the classes of the elements on which it operates.

Universite Lille 1 - Licence Informatique Conception Orientee Objet 52