Dans cette série, je propose de découvrir le patron Façade (Facade Pattern). En deux mots, celui-ci consiste à définir une interface qui permet une utilisation réduite et simplifiée d’un ensemble de fonctionnalités. Pour l’illustrer, nous allons faire une façade de la bibliothèque graphique AWT pour un jeu 2D en tuiles.
Commençons par la façade la plus simple du monde avec une unique méthode createWindow()
qui permet à l’utilisateur de créer une nouvelle fenêtre:
Créer une fenêtre avec cette façade est extrêmement simple: on instancie une implantation de la façade (l. 1), puis on invoque la méthode createWindow()
(l. 2):
GUIFacade gui = new AWTGUIFacade(); gui.createWindow("Facade bibliothèque graphique AWT");
Dans cet exemple, je vous propose d’implanter une création de fenêtre avec la bibliothèque AWT: d’autres implantations sont possibles sans que cela ne perturbe l’interface GUIFacade
et son utilisation. Une classe AWTWindow
qui implante java.awt.Frame
est définie pour pouvoir gérer les spécificités de notre fenêtre:
La méthode createWindow()
de la classe AWTGUIFacade
instancie une AWTWindow
(l. 4), l’initialise avec un titre (l. 5), la place au centre de l’écran (l. 6) et la rend visible (l. 7):
public class AWTGUIFacade implements GUIFacade { @Override public void createWindow(String title) { AWTWindow window = new AWTWindow(); window.init(title); window.setLocationRelativeTo(null); window.setVisible(true); } }
La classe AWTWindow
possède une méthode init()
qui initialise la fenêtre avec un titre donné (l. 3), une taille de 640 par 480 pixels (l. 4), interdit le redimensionnement (l. 5) et assure que la fenêtre est détruite lorsqu’on la ferme (l. 6-11):
public class AWTWindow extends Frame { public void init(String title) { setTitle(title); setSize(640, 480); setResizable(false); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent we) { dispose(); } }); } }
La création de la fenêtre est répartie entre la méthode
createWindow()
de la classe AWTGUIFacade
et la méthode init()
de la classe AWTWindow
. La principale motivation ici est de séparer les opérations plus dynamiques, comme la position de la fenêtre, des opérations plus statiques, comme le titre ou le fait que la fenêtre n’est pas pensée pour être redimensionnée. Il existe bien d’autres possibilités en fonction des extensions possibles de la façade.
Grâce à cette façade, un utilisateur peut facilement créer une fenêtre pour une utilisation précise, sans avoir à connaître toutes les méthodes et subtilités d’une bibliothèque graphique. De plus, hormis l’instanciation d’une implantation de la façade (i.e., new AWTGUIFacade()
), tout le code qui suit ne dépend plus de la bibliothèque graphique (la variable gui
dans le premier code exemple est de type GUIFacade
). Cela signifie qu’il est possible de passer d’une implantation à l’autre, et donc d’une bibliothèque graphique à une autre. Cette propriété est très intéressant lorsqu’on souhaite faire du multi-plateforme, ou si le premier choix de bibliothèque graphique n’était pas le bon. Dans tous les cas, on passe d’une bibliothèque à l’autre sans avoir à réécrire toute l’application !
Cet article présente une première approche très simple, et pose les bases du patron façade. Dans les articles suivants, les choses gagneront en complexité, et vous verrez ce qui peut être obtenu à partir d’un patron dont le postulat de base semble si simple !
Le code de cet article peut être téléchargé ici.
Pour compiler, saisissez: javac fr/phtools/awtfacade01/Main.java
Pour lancer, saisissez: java fr.phtools.awtfacade01.Main