Java – Design Patterns Eric Blaudez ([email protected])| 04 Les patrons de conceptions • Introduction • Modèles de création • Modèles de structure • Modèles de comportement Java -Design Patterns Description 2 Agenda • Modèles de création • Modèles de structure • Modèles de comportement Java -Design Patterns • Introduction 3 Introduction Formalisés dans le livre du « Gang of Four » (GoF, Erich Gamma, Richard Helm, Ralph Johnson (en) et John Vlissides (en)) intitulé Design Patterns - Elements of Reusable Object-Oriented Software9 en 1995. Les patrons de conception tirent leur origine des travaux de l'architecte Christopher Alexander dans les années 70, dont son livre A Pattern Language définit un ensemble de patrons d'architecture. (Wikipedia : Patrons de conception) Java -Design Patterns Les patrons de conceptions (Design Patterns) proposent des modélisations de problèmes connus. 4 Introduction Il existe 3 types de patrons de conceptions: Java -Design Patterns • Construction : instanciation & configuration des objets • Structure : organisation des classes • Comportement : collaboration entre les objets 5 Modèles de création Modèles de structure Modèle de comportement Factory Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Proxy Chain of responsability Command Interpreter Iterator Mediator Memento Flyweight Observer State Strategy Template method Visitor Java -Design Patterns Introduction 6 Agenda • Introduction de création • Modèles de structure • Modèles de comportement Java -Design Patterns • Modèles 7 Modèles de création Le patron de conception Singleton assure qu'un seul objet sera créé. Il n'y pas d'instanciation directe, pour accéder à l'objet il faut utiliser une méthode statique. Java -Design Patterns Singleton 8 Modèles de création Singleton Java -Design Patterns Dans l'exemple proposé, l'objet Session n'aura qu'une seule instanciation durant toute la vie du programme. Cela assure que chaque objet ayant accès à l'objet Session disposera des mêmes informations. 9 Modèles de création Singleton private Session () { name = null; id = java.util.UUID.randomUUID().toString(); } public static Session instance() { if (self == null) { self = new Session(); } return self; } public String programPath() { return System.getProperty("user.dir"); } public String sessionId() { return id; } public void setAppName(String name) { self.name = name; } public String getAppName() { return self.name; } } Java -Design Patterns public class Session { static private Session self = null; private String name; private String id; 10 Modèles de création Le patron de conception Factory cache à l'utilisateur toute la mécanique de création d'un objet. Une Factory fournie une instanciation des objets ayant une interface pour laquelle elle a été conçue. Java -Design Patterns Factory 11 Modèles de création Factory Java -Design Patterns L'exemple propose la création d'un objet Music ou Video en utilisant une Factory. Ainsi la méthode getMedia retourne une instanciation de l'un de ces objets en fonction d'une chaîne de caractères 12 Modèles de création Factory public interface Media { public void play(); } public class Music implements Media { public Music () { }; public void play() { System.err.println("Play music"); } } public class MediaFactory { public MediaFactory () { }; public Media getMedia(String mediaType) { if (mediaType.equals("video")) { return new Video(); } else if (mediaType.equals("music")) { return new Music(); } return null; } } Java -Design Patterns public class Video implements Media { public Video () { }; public void play() { System.err.println("Play video"); } } 13 Agenda • Modèles de création • Modèle de structure • Modèles de comportement Java -Design Patterns • Introduction 14 Modèles de création Proxy L'exemple proposé, montre la création d'un Proxy de l'objet Music. L'objet Music est créé lors du premier appel de la méthode interfacée play. Java -Design Patterns La patron de conception Proxy permet l'instanciation d'un objet au moment de son utilisation. 15 Modèles de création Proxy public class Music implements Media { public void play() { System.err.println("Play Music"); } } public class MusicProxy implements Media { protected Media media; public MusicProxy () { media = null; }; public void play() { if (media == null) { media = new Music(); } media.play(); } } Java -Design Patterns public interface Media { public void play(); } 16 Modèles de création Decorator Java -Design Patterns La patron de conception Decorator permet l'ajout de fonctionnalités sur un objet existant. 17 Modèles de création Decorator Java -Design Patterns Dans le Decorator proposé, l'objet TunedMedia ajoute une information de volume aux objets dérivant la d'interface Media 18 Modèles de création Decorator public class Music implements Media { public void play() { System.err.println("Play Music"); } } public abstract class MediaDecorator implements Media { protected Media media; public MediaDecorator(Media media) { this.media = media; } @Override abstract public void play(); } public class TunedMedia extends MediaDecorator { private int volume; public void setVolume (int volume) { this.volume = volume; } public TunedMedia(Media media) { super(media); volume=5; } public void play() { System.err.print("[Volume:"+volume+"] "); media.play(); } } Java -Design Patterns public interface Media { public void play(); } 19 Agenda • Modèles de création • Modèles de structure • Modèle de comportement Java -Design Patterns • Introduction 20 Modèles de comportement Observer Java -Design Patterns La patron de conception Observer permet la notification d'un état à plusieurs objets (les Observers). 21 Modèles de comportement Observer Java -Design Patterns Dans l'exemple proposé l'objet MediaPlayList informe les Observers, MusicPlayer et VideoPlayer d'un changement de volume. 22 Modèles de comportement public class MediaPlayList { private ArrayList<MediaObserver> observers; private int volume; public MediaPlayList () { this.observers = new ArrayList<MediaObserver>(); }; public void setVolume (int volume) { this.volume = volume; notifyAllObservers(); } public int getVolume () { return volume; } public void addObserver(MediaObserver observer) { observers.add(observer); } public void notifyAllObservers() { for (MediaObserver observer : observers) { observer.update(); } } } public class MusicPlayer extends MediaObserver { public MusicPlayer (MediaPlayList mediaPlayList) { super(mediaPlayList); } @Override public void update() { System.err.println("Music Player Volume updated to [" +super.mediaPlayList.getVolume()+"]"); } } public abstract class MediaObserver { protected MediaPlayList mediaPlayList; public MediaObserver (MediaPlayList mediaPlayList) { this.mediaPlayList = mediaPlayList; this.mediaPlayList.addObserver(this); } abstract public void update(); } } public class VideoPlayer extends MediaObserver { public VideoPlayer (MediaPlayList mediaPlayList) { super(mediaPlayList); } @Override public void update() { System.err.println("Video Player Volume updated to [" +super.mediaPlayList.getVolume()+"]"); } } Java -Design Patterns Observer 23 Modèles de comportement State Le patron de conception State permet la modification de comportement d'un objet (le contexte) sans en modifier l'instance. Java -Design Patterns L'exemple propose de conserver dans un contexte l'état d'un Player : stoppé ou en cours. 24 Modèles de comportement State public class Context { private PlayerState state; public Context () { } public void setState(PlayerState state) { this.state = state; } public PlayerState getState() { return state; } } public class StopState extends PlayerState { public StopState () { } public void doAction(Context context) { context.setState(this); System.err.println("Stop action"); } public String name() { return "stop"; } } Java -Design Patterns public abstract class PlayerState { abstract public void doAction(Context context); abstract public String name(); } public class PlayState extends PlayerState { public PlayState () { } public void doAction(Context context) { context.setState(this); System.err.println("Play action"); } public String name() { return "play"; } } 25