Skip to content

Урок 9. Фасад (Facade)

Шаблон проектирования "Фасад" (Facade) предоставляет упрощенный интерфейс к сложной системе классов, библиотек или фреймворков. Он скрывает сложность системы и предоставляет клиенту более простой способ взаимодействия с ней.

Пример использования паттерна Facade на Java

Рассмотрим пример, в котором мы создадим систему для управления домашним кинотеатром. У нас будет несколько компонентов: Amplifier, DVDPlayer, Projector и Screen. Фасад будет предоставлять простой интерфейс для управления всеми этими компонентами.

Шаг 1: Создание классов компонентов

public class Amplifier {
    public void on() {
        System.out.println("Amplifier is on");
    }

    public void off() {
        System.out.println("Amplifier is off");
    }

    public void setVolume(int level) {
        System.out.println("Setting volume to " + level);
    }
}

public class DVDPlayer {
    public void on() {
        System.out.println("DVD Player is on");
    }

    public void off() {
        System.out.println("DVD Player is off");
    }

    public void play(String movie) {
        System.out.println("Playing movie: " + movie);
    }
}

public class Projector {
    public void on() {
        System.out.println("Projector is on");
    }

    public void off() {
        System.out.println("Projector is off");
    }

    public void setInput(DVDPlayer dvdPlayer) {
        System.out.println("Projector input set to DVD Player");
    }
}

public class Screen {
    public void down() {
        System.out.println("Screen is down");
    }

    public void up() {
        System.out.println("Screen is up");
    }
}

Шаг 2: Реализация фасада

public class HomeTheaterFacade {
    private Amplifier amplifier;
    private DVDPlayer dvdPlayer;
    private Projector projector;
    private Screen screen;

    public HomeTheaterFacade(Amplifier amplifier, DVDPlayer dvdPlayer, Projector projector, Screen screen) {
        this.amplifier = amplifier;
        this.dvdPlayer = dvdPlayer;
        this.projector = projector;
        this.screen = screen;
    }

    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        screen.down();
        projector.on();
        projector.setInput(dvdPlayer);
        amplifier.on();
        amplifier.setVolume(5);
        dvdPlayer.on();
        dvdPlayer.play(movie);
    }

    public void endMovie() {
        System.out.println("Shutting movie theater down...");
        dvdPlayer.off();
        amplifier.off();
        projector.off();
        screen.up();
    }
}

Шаг 3: Использование фасада

Теперь мы можем использовать наш фасад в коде:

public class FacadePatternDemo {
    public static void main(String[] args) {
        Amplifier amplifier = new Amplifier();
        DVDPlayer dvdPlayer = new DVDPlayer();
        Projector projector = new Projector();
        Screen screen = new Screen();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier, dvdPlayer, projector, screen);

        // Начинаем просмотр фильма
        homeTheater.watchMovie("Inception");
        System.out.println("");

        // Завершаем просмотр фильма
        homeTheater.endMovie();
    }
}

Объяснение

  1. Классы компонентов: Amplifier, DVDPlayer, Projector и Screen представляют собой различные компоненты домашнего кинотеатра. Каждый из них имеет свои методы для управления.

  2. Класс HomeTheaterFacade: Этот класс объединяет все компоненты и предоставляет простой интерфейс для их управления. Методы watchMovie() и endMovie() упрощают процесс подготовки к просмотру фильма и его завершения.

  3. Класс FacadePatternDemo: Демонстрирует использование фасада. Мы создаем экземпляры всех компонентов и передаем их в фасад. Затем вызываем методы для начала и завершения просмотра фильма.

Заключение

Паттерн "Фасад" упрощает взаимодействие с сложными системами, предоставляя клиентам более простой интерфейс. В приведенном примере мы увидели, как можно создать фасад для управления домашним кинотеатром, скрывая сложность взаимодействия с отдельными компонентами.

пример

https://gitlab.com/synergy9980417/razdel2/7_9