Autumn SALE
Fasada

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:

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.

Fasada w innych językach

Fasada w języku C# Fasada w języku C++ Fasada w języku Go Fasada w języku PHP Fasada w języku Python Fasada w języku Ruby Fasada w języku Rust Fasada w języku Swift Fasada w języku TypeScript