Façade (patron de conception)
En génie logiciel, le patron de conception (ou design pattern) façade a pour but de cacher une conception et une interface complexe difficile à comprendre (cette complexité étant apparue « naturellement » avec l'évolution du sous-système en question).
Objectif
[modifier | modifier le code]La façade permet de simplifier cette complexité en fournissant une interface simple du sous-système. Habituellement, la façade est réalisée en réduisant les fonctionnalités de ce dernier, mais en fournissant toutes les fonctions nécessaires à la plupart des utilisateurs.
La façade encapsule la complexité des interactions entre les objets métier participant à un workflow.
Une façade peut être utilisée pour :
- rendre une bibliothèque plus facile à utiliser, comprendre et tester;
- rendre une bibliothèque plus lisible;
- réduire les dépendances entre les clients de la bibliothèque et le fonctionnement interne de celle-ci, ainsi on gagne en flexibilité pour les évolutions futures du système;
- assainir une API que l'on ne peut pas modifier si celle-ci est mal conçue, ou mieux découper ses fonctionnalités si celle-ci n'est pas assez claire.
Un adaptateur est utilisé lorsque l'on doit respecter une interface bien définie. La façade est utilisée pour simplifier l'utilisation de l'API.
Structure
[modifier | modifier le code]- Façade
- La façade fait abstraction des packages 1, 2 et 3 du reste de l'application.
- Clients
- Les objets utilisant le patron de conception Façade pour accéder aux ressources abstraites.
Exemple
[modifier | modifier le code]Java
[modifier | modifier le code]L'exemple suivant cache une API de gestion de calendrier compliquée, derrière une façade plus simple. Il affiche :
Date: 1980-08-20 20 jours après : 1980-09-09
import java.util.*;
// Façade
class UserfriendlyDate {
GregorianCalendar gcal;
public UserfriendlyDate(String isodate_ymd) {
String[] a = isodate_ymd.split("-");
gcal = new GregorianCalendar(Integer.parseInt(a[0]),
Integer.parseInt(a[1])-1 /* !!! */, Integer.parseInt(a[2]));
}
public void addDays(int days) {
gcal.add(Calendar.DAY_OF_MONTH, days);
}
public String toString() {
return String.format("%1$tY-%1$tm-%1$td", gcal);
}
}
// Client
class FacadePattern {
public static void main(String[] args) {
UserfriendlyDate d = new UserfriendlyDate("1980-08-20");
System.out.println("Date : "+d);
d.addDays(20);
System.out.println("20 jours après : "+d);
}
}