![Façade](/images/patterns/cards/facade-mini.png?id=71ad6fa98b168c11cb3a1a9517dedf78)
Façade en Java
La Façade est un patron de conception structurel qui fournit une interface simplifiée (mais limitée) à un système complexe de classes, bibliothèques ou frameworks.
La façade permet non seulement de diminuer la complexité générale d’une application, mais elle permet également de rassembler les dépendances indésirables au même endroit.
Complexité :
Popularité :
Exemples d’utilisation : La façade est régulièrement utilisée dans les applications écrites en Java. Elle se révèle très pratique pour gérer les bibliothèques complexes et les API.
Voici quelques exemples tirés des bibliothèques principales de Java :
-
javax.faces.context.FacesContext
utiliseLifeCycle
,ViewHandler
,NavigationHandler
qui sont des classes cachées sous le capot, mais la majorité des clients n’en ont pas conscience. -
javax.faces.context.ExternalContext
utiliseServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
et d’autres à l’intérieur.
Identification : La façade peut être reconnue dans une classe qui a une interface simple, mais délègue la majorité des tâches à d’autres. En général, elle gère le cycle de vie complet des objets qu’elle utilise.
Interface simple pour une bibliothèque de conversion vidéo complexe
Dans cet exemple, la façade simplifie la communication avec un framework complexe de conversion vidéo.
Elle fournit une seule classe dotée d’une seule méthode qui gère toute la complexité de la configuration des bonnes classes du framework et de la récupération du résultat dans le format attendu.
some_complex_media_library: Bibliothèque de conversion vidéo complexe
some_complex_media_library/VideoFile.java
package refactoring_guru.facade.example.some_complex_media_library;
public class VideoFile {
private String name;
private String codecType;
public VideoFile(String name) {
this.name = name;
this.codecType = name.substring(name.indexOf(".") + 1);
}
public String getCodecType() {
return codecType;
}
public String getName() {
return name;
}
}
some_complex_media_library/Codec.java
package refactoring_guru.facade.example.some_complex_media_library;
public interface Codec {
}
some_complex_media_library/MPEG4CompressionCodec.java
package refactoring_guru.facade.example.some_complex_media_library;
public class MPEG4CompressionCodec implements Codec {
public String type = "mp4";
}
some_complex_media_library/OggCompressionCodec.java
package refactoring_guru.facade.example.some_complex_media_library;
public class OggCompressionCodec implements Codec {
public String type = "ogg";
}
some_complex_media_library/CodecFactory.java
package refactoring_guru.facade.example.some_complex_media_library;
public class CodecFactory {
public static Codec extract(VideoFile file) {
String type = file.getCodecType();
if (type.equals("mp4")) {
System.out.println("CodecFactory: extracting mpeg audio...");
return new MPEG4CompressionCodec();
}
else {
System.out.println("CodecFactory: extracting ogg audio...");
return new OggCompressionCodec();
}
}
}
some_complex_media_library/BitrateReader.java
package refactoring_guru.facade.example.some_complex_media_library;
public class BitrateReader {
public static VideoFile read(VideoFile file, Codec codec) {
System.out.println("BitrateReader: reading file...");
return file;
}
public static VideoFile convert(VideoFile buffer, Codec codec) {
System.out.println("BitrateReader: writing file...");
return buffer;
}
}
some_complex_media_library/AudioMixer.java
package refactoring_guru.facade.example.some_complex_media_library;
import java.io.File;
public class AudioMixer {
public File fix(VideoFile result){
System.out.println("AudioMixer: fixing audio...");
return new File("tmp");
}
}
facade
facade/VideoConversionFacade.java: La façade fournit une interface simple de conversion vidéo
package refactoring_guru.facade.example.facade;
import refactoring_guru.facade.example.some_complex_media_library.*;
import java.io.File;
public class VideoConversionFacade {
public File convertVideo(String fileName, String format) {
System.out.println("VideoConversionFacade: conversion started.");
VideoFile file = new VideoFile(fileName);
Codec sourceCodec = CodecFactory.extract(file);
Codec destinationCodec;
if (format.equals("mp4")) {
destinationCodec = new MPEG4CompressionCodec();
} else {
destinationCodec = new OggCompressionCodec();
}
VideoFile buffer = BitrateReader.read(file, sourceCodec);
VideoFile intermediateResult = BitrateReader.convert(buffer, destinationCodec);
File result = (new AudioMixer()).fix(intermediateResult);
System.out.println("VideoConversionFacade: conversion completed.");
return result;
}
}
Demo.java: Code client
package refactoring_guru.facade.example;
import refactoring_guru.facade.example.facade.VideoConversionFacade;
import java.io.File;
public class Demo {
public static void main(String[] args) {
VideoConversionFacade converter = new VideoConversionFacade();
File mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4");
// ...
}
}
OutputDemo.txt: Résultat de l’exécution
VideoConversionFacade: conversion started.
CodecFactory: extracting ogg audio...
BitrateReader: reading file...
BitrateReader: writing file...
AudioMixer: fixing audio...
VideoConversionFacade: conversion completed.