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

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

 

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

Java modifier

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);
     }
 }