
Fasada w języku Java
Fasada to strukturalny wzorzec projektowy wyposażający złożony system klas, bibliotekę lub framework w uproszczony interfejs.
Fasada zmniejsza ogólną złożoność aplikacji oraz pomaga przenieść niechciane zależności w jedno miejsce w programie.
Złożoność:
Popularność:
Przykłady użycia: Wzorzec Fasada jest często stosowany w aplikacjach napisanych w Javie, szczególnie w celu współpracy ze złożonymi bibliotekami i interfejsami programowania aplikacji.
Oto przykłady użycia wzorca Fasada w głównych bibliotekach Java:
-
javax.faces.context.FacesContext
używa klasLifeCycle
,ViewHandler
,NavigationHandler
za kulisami, ale większość klientów nie jest tego świadoma. -
javax.faces.context.ExternalContext
używaServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
oraz innych — wewnątrz.
Identyfikacja: Użycie Fasady można stwierdzić po istnieniu klasy o uproszczonym interfejsie, która deleguje większość swoich zadań innym klasom. Zazwyczaj fasady zarządzają całym cyklem życia używanych przez siebie obiektów.
Prosty interfejs skomplikowanej klasy do konwersji wideo
W poniższym przykładzie Fasada upraszcza komunikację ze złożonym frameworkiem służącym konwersji filmików.
Fasada udostępnia pojedynczą klasę z jedną metodą której zadaniem jest konfiguracja odpowiednich klas frameworku oraz pobieranie wyników ich działania w odpowiednim formacie.
some_complex_media_library: Złożona biblioteka konwersji wideo
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: Fasada udostępnia prosty interfejs służący konwersji filmików
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: Kod klienta
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: Wynik działania
VideoConversionFacade: conversion started. CodecFactory: extracting ogg audio... BitrateReader: reading file... BitrateReader: writing file... AudioMixer: fixing audio... VideoConversionFacade: conversion completed.